JSFiddle - React, Tailwind, and code Playground
by dimitrs_papadimitriou
JavaScript
var Coyoneda = (x, g) => ({
N: "Coyoneda",
map: f => Coyoneda(x, x => f(g(x))),
chain: f => f(g(x)),
run: () => g(x),
cata: alg => alg(g(x))
});
var liftC = x => Coyoneda(x, y => y);
var t = liftC({ v: 1 }).chain(x => liftC({ v: 1 + x.v }));
var IO = fn => ({
N: "IO",
map: f => IO(() => f(fn())),
chain: f => IO(() => f(fn()).run()),
run: () => fn(),
fold: (acc, accf) => accf(acc, fn()),
cata: alg => alg(fn())
});
var Id = v => ({
N: "Id",
v: v,
map: f => Id(f(v)),
chain: f => f(v),
cata: alg => alg(v)
});
var PureF = x => ({
N: "PureF",
x: x,
map: g => PureF(g(x)),
chain: g => g(x),
cata: alg => alg(x),
});
var FreeF = fx => ({
N: "FreeF",
fx: fx,
map: g => FreeF(fx.map(x => x.map(g))),
chain: g => FreeF(fx.map(x => x.chain(g))),
cata: alg => fx.map(x => x.cata(alg)),
});
var toIO = x =>IO(() => x)//liftC(x);
var liftF = command => FreeF(toIO(command).map(PureF));
var e = liftF({ v: 4 }) .chain(t => liftF({ v: t.v + 4 }) );
e.cata(console.log) ;
var set = number => liftF({ v: number });
var get = liftF({ v: 5 });
get.cata(console.log)
var result = get.chain(set);
result.cata(console.log ) ;