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 ?...