#ifndef __BINMEMOISE_H__ #define __BINMEMOISE_H__ #include "delegate.h" #include "bintree.h" template BinTree code(Fun1 fun) { return mkLazy(mkFun([] (Fun1 fun) { auto val = mkLazy(mkFun([] (Fun1 fun) { return fun.invoke (Ref::mk (0L)); })); auto lFun = mkFun1([] (Fun1 fun, R n) { return fun.invoke (Ref::mk (*n * 2L + 1L)); }); auto rFun = mkFun1([] (Fun1 fun, R n) { return fun.invoke (Ref::mk (*n * 2L + 2L)); }); return Ref::mk > (code(lFun), val, code(rFun)); }, fun)); } template Fun1 decode(BinTree tree) { return mkFun1([] (BinTree tree, R n) { if (*n == 0L) { return tree->get(); } else if (*n % 2L == 1L) { return (decode (tree->getLeft())).invoke (Ref::mk ((*n - 1L) / 2L)); } else { return (decode (tree->getRight())).invoke (Ref::mk ((*n - 2L) / 2L)); } }); } #endif