JSFiddle - React, Tailwind, and code Playground

by dimitrs_papadimitriou

JavaScript

Object.prototype.l = function() {
  console.log(JSON.stringify(this));
};

var ValueF = v => ({v:v,
  eval: alg => alg.value(v),
  mapF: f => ValueF(v),
  map: f => ValueF(f(v))
});
var AddF = (l, r) => ({l:l, r:r,
  eval: alg => alg.add(l, r),
  mapF: f => AddF(f(l), f(r)),
  map: f => AddF(l.map(f), r.map(f))
});

var Fix = a => ({ unfix: a , mapF : f=>a.mapF(f)});

var numeral = AddF(ValueF(2), ValueF(4));
var numeralA = AddF(ValueF([2, 3]), ValueF([4, 5, 6]));
var numeralinitial = Fix(AddF(Fix(ValueF(2)), Fix(ValueF(4))));

var intialAlg = { value: v => Fix(ValueF(v)), add: (a, v) =>Fix(AddF(Fix(a), Fix(v))) };

var intAlg = { value: v => v, add: (a, v) => v + a };
var arrayAlgebra = { value: v => v, add: (a, v) => a.concat(v) };
var stringAlgebra = { value: v => v, add: (a, v) => v + a };

//

 


var cata = algebra => fix => fix.mapF(cata(algebra)).eval(algebra);

var h = x => x.reduce((a, b) => a * b, 1);
var t = cata(arrayAlgebra)(numeralA);

var intitialCata  =  cata(intialAlg)(numeralinitial);

var t1 = cata(intAlg)(numeralA.map(h));
var t2 = h(cata(arrayAlgebra)(numeralA));
t.l();