source: liblaziness/binmemoise.h @ 27

Last change on this file since 27 was 4, checked in by artyom, 13 years ago

liblaziness

File size: 931 bytes
Line 
1#ifndef __BINMEMOISE_H__
2#define __BINMEMOISE_H__
3#include "delegate.h"
4#include "bintree.h"
5
6template<typename T>
7BinTree<T> code(Fun1<T, Int> fun)
8{
9        return mkLazy(mkFun([] (Fun1<T, Int> fun) {
10                auto val = mkLazy(mkFun([] (Fun1<T, Int> fun) { return fun.invoke (Ref::mk (0L)); }));
11                auto lFun = mkFun1([] (Fun1<T, Int> fun, R<Int> n) { return fun.invoke (Ref::mk (*n * 2L + 1L)); });
12                auto rFun = mkFun1([] (Fun1<T, Int> fun, R<Int> n) { return fun.invoke (Ref::mk (*n * 2L + 2L)); });
13                return Ref::mk <BinTree<T>> (code(lFun), val, code(rFun));
14        }, fun));
15}
16
17template<typename T>
18Fun1<T, Int> decode(BinTree<T> tree)
19{
20        return mkFun1([] (BinTree<T> tree, R<Int> n)
21        {
22                if (*n == 0L)
23                {
24                        return tree->get();
25                }
26                else if (*n % 2L == 1L)
27                {
28                        return (decode (tree->getLeft())).invoke (Ref::mk ((*n - 1L) / 2L));
29                }
30                else
31                {
32                        return (decode (tree->getRight())).invoke (Ref::mk ((*n - 2L) / 2L));
33                }
34        });
35}
36
37#endif
Note: See TracBrowser for help on using the repository browser.