#ifndef __LAZY_OP_H__ #define __LAZY_OP_H__ #include "lazy.h" template class LazyOp { public: typedef Delegate1, LazyBase> D1; typedef Delegate2, LazyBase, LazyBase> D2; static D1 inc; static D1 sqr; static D2 add; private: static D1 mkInc() { return mkLFun1([] (Lazy x) { return mkLazy(mkLFun([] (Lazy x) { return Ref::mk (*x + 1); }, x)); }); } static D1 mkSqr() { return mkLFun1([] (Lazy x) { return mkLazy(mkLFun([] (Lazy x) { auto val = *x; return Ref::mk (val*val); }, x)); }); } static D2 mkAdd() { return mkLFun2([] (Lazy x, Lazy y) { return mkLazy(mkLFun([] (Lazy x, Lazy y) { return Ref::mk (*x + *y); }, x, y)); }); } }; template typename LazyOp::D1 LazyOp::inc = LazyOp::mkInc(); template typename LazyOp::D1 LazyOp::sqr = LazyOp::mkSqr(); template typename LazyOp::D2 LazyOp::add = LazyOp::mkAdd(); #endif