JSFiddle - React, Tailwind, and code Playground

by dimitrs_papadimitriou

JavaScript

var Identity = v => ({ value: v, map: f => Identity(f(v)) });
var pair = (f, g) => r => a => b =>
  f(a)
    .map(r)
    .map(c => g(b).map(c));
var pairingResult = pair(Identity, Identity)(a => b => a * b)(2)(3);

// Array.prototype.zip = function(b) {
//   return this.map((e, i) => [{ f: b[i], s: e }]);
// };

Array.prototype.zip = function(b) {
  var [x, ...xs] = this;
  var [y, ...ys] = b;
  if (xs.length && ys.length) return [{ f: x, s: y }].concat(xs.zip(ys));
};

var t = [1, 3, 5, 6, 7].zip([2, 3, 5, 6]);

var PureF = x => ({
  x: x,
  map: g => PureF(g(x)),
  pair: (f, c) => f(c.a)(x)
});

var FreeF = fx => ({
  fx: fx,
  map: g => FreeF(fx.map(x => x.map(g))),
  pair: (f, c) => fx.map(x => x.pair(f, c.cofin())).value
});

var CoFreeF = (a, cofin) => ({
  a: a,
  cofin: cofin,
  extract: () => a,
  map: g => CoFreeF(g(a), () => cofin().map(g))
});

var anaC = n => CoFreeF(n + 1, () => anaC(n + 1));

var stream = anaC(0);

// var freeC = CoFreeF(2, ()=>CoFreeF(5, ()=>Identity(7)));
//var freeM = FreeF(id(FreeF(id(PureF(3)))));

var freeM1 = PureF(0);
var freeM2 = FreeF(Identity(PureF(0)));
var freeM3 = FreeF(Identity(FreeF(Identity(PureF(0)))));

var pairingResult1 = freeM1.pair(a => b => a + b, stream);
var pairingResult2 = freeM2.pair(a => b => a + b, stream);
var pairingResult3 = freeM3.pair(a => b => a + b, stream);
var Sum = v => ({ v: v, empty: 0, concat: y => Sum(y.v + v) });
var TreeMonoid = m => tree => ({
  tree: tree,
  empty: lf(m.empty),
  concat: y => {
    return n(
      m(tree.l.v).concat(m(y.tree.l.v)),
      m(tree.r.v).concat(m(y.tree.r.v))
    );
  }
});

var n = (l, r) => ({
  l: l,
  r: r,
  map: f => n(l.map(f), r.map(f)),
  fold: (acc, accf) =>
    accf(accf(accf(acc, l.fold(acc, accf)), v), r.fold(acc, accf)),

  foldMap: f => l.foldMap(f).concat(r.foldMap(f))
});

var lf = v => ({
  v: v,
  map: f => lf(f(v)),
  fold: (acc, accf) => accf(acc, v),
  foldMap: f => f(v)
});

var r = n(lf(7), n(lf(5), lf(6))).foldMap(x => (x > 4 ?...