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