module Make.Memo.Dynamic (MonadMemo,memo1,memoPure1,memo2,module Data.DynamicC) where import Data.DynamicC import Make.Memo (MonadMemo) import qualified Make.Memo as Memo import Control.Arrow import Control.Monad import Data.Typeable memo1 t a = fmap fromDynC (Memo.memo1 td (fmap (liftM toDynC) a)) `asTypeOf` (return (foo a)) where foo :: n (m repr) -> repr foo = undefined td = toDynTC t (foo a) memoPure1 t a = fmap fromDynC (Memo.memo1 (toDynTC t (foo a)) (fmap (return . toDynC) a)) `asTypeOf` a where foo :: n repr -> repr foo = undefined memo2 (t1,t2) a = ((fmap fromDynC *** fmap fromDynC) $ Memo.memo2 (t1d,t2d) (fmap (liftM (toDynC *** toDynC)) a)) `asTypeOf` h a where f :: n (m (repr,a)) -> repr s :: n (m (a,repr)) -> repr s = undefined; f = undefined h :: n (m (a,b)) -> (n a, n b) h = undefined t1d = toDynTC t1 (f a) t2d = toDynTC t2 (s a)