Binary Tree Catamorphism
by dimitrs_papadimitriou
HTML
<script src="https://rawgit.com/eu81273/jsfiddle-console/master/console.js"></script>
JavaScript
var algList = {
node: (l, v, r) => [].concat(l).concat(v).concat(r),
leaf: (l) => [l]
};
var algSumInt = {
node: (n) => n.l + n.v + n.r,
leaf: (l) => l.v
};
var algPr = {
node: (l, v, r) => `((${l}),${v},(${r}))`,
leaf: (l) => l
};
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(lf(2), 2, lf(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(algSumInt));