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);

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

var FreeF = fx => ({
  fx: fx,
  map: g => FreeF(fx.map(x => x.map(g))),
  bind: g => FreeF(fx.map(x => x.bind(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 anaFree = n => (n == 0 ? PureF(0) : FreeF(Identity(anaFree(n - 1))));

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

var stream = anaC(10);
 
var pairingResult1 = anaFree(20).pair(a => b => a + b, stream);