Binary Tree Catamorphism

by dimitrs_papadimitriou

HTML

<script src="https://rawgit.com/eu81273/jsfiddle-console/master/console.js"></script>

JavaScript

var algSumInt = {
   node: (n) => n.l + n.v + n.r,
   leaf: (l) => l.v
 };

 var n = (l, v, r) => ({
   l: l,
   v: v,
   r: r,
   map: f => n(l.map(f), f(v), r.map(f)),
   cata: (alg) => alg.node(n(l.cata(alg), v, r.cata(alg))),

 });

 var lf = v => ({
   v: v,
   map: f => lf(f(v)),
   cata: (alg) => alg.leaf(lf(v)),
 });

 var inst = n(2, 2, 3);


 var inst = n(n(n(lf(2), 2, lf(3)), 2, lf(3)),  2, 
 n(lf(2), 2, n(lf(2), 2, lf(3))));
 
 console.log(inst.cata({
   node: (n) => n.l + n.v + n.r,
   leaf: (l) => l.v
 }));