{-# LANGUAGE NoImplicitPrelude #-}
module Control.Monad.Trans.Memo.Map
(
MemoT,
runMemoT,
evalMemoT,
startRunMemoT,
startEvalMemoT,
Memo,
runMemo,
evalMemo,
startRunMemo,
startEvalMemo,
) where
import Data.Functor.Identity
import Control.Monad
import Control.Monad.Trans.Memo.State
import Data.MapLike.Instances()
import qualified Data.Map as M
type MemoT k v = MemoStateT (M.Map k v) k v
runMemoT :: Monad m => MemoT k v m a -> M.Map k v -> m (a, M.Map k v)
runMemoT :: MemoT k v m a -> Map k v -> m (a, Map k v)
runMemoT = MemoT k v m a -> Map k v -> m (a, Map k v)
forall (m :: * -> *) s k v a.
Monad m =>
MemoStateT s k v m a -> s -> m (a, s)
runMemoStateT
evalMemoT :: Monad m => MemoT k v m a -> M.Map k v -> m a
evalMemoT :: MemoT k v m a -> Map k v -> m a
evalMemoT = MemoT k v m a -> Map k v -> m a
forall (m :: * -> *) c k v a.
Monad m =>
MemoStateT c k v m a -> c -> m a
evalMemoStateT
startRunMemoT :: Monad m => MemoT k v m a -> m (a, M.Map k v)
startRunMemoT :: MemoT k v m a -> m (a, Map k v)
startRunMemoT = (MemoT k v m a -> Map k v -> m (a, Map k v)
forall (m :: * -> *) k v a.
Monad m =>
MemoT k v m a -> Map k v -> m (a, Map k v)
`runMemoT` Map k v
forall k a. Map k a
M.empty)
startEvalMemoT :: Monad m => MemoT k v m a -> m a
startEvalMemoT :: MemoT k v m a -> m a
startEvalMemoT = (MemoT k v m a -> Map k v -> m a
forall (m :: * -> *) k v a.
Monad m =>
MemoT k v m a -> Map k v -> m a
`evalMemoT` Map k v
forall k a. Map k a
M.empty)
type Memo k v = MemoT k v Identity
runMemo :: Memo k v a -> M.Map k v -> (a, M.Map k v)
runMemo :: Memo k v a -> Map k v -> (a, Map k v)
runMemo = Memo k v a -> Map k v -> (a, Map k v)
forall c k v a. MemoState c k v a -> c -> (a, c)
runMemoState
evalMemo :: Memo k v a -> M.Map k v -> a
evalMemo :: Memo k v a -> Map k v -> a
evalMemo = Memo k v a -> Map k v -> a
forall c k v a. MemoState c k v a -> c -> a
evalMemoState
startRunMemo :: Memo k v a -> (a, M.Map k v)
startRunMemo :: Memo k v a -> (a, Map k v)
startRunMemo = (Memo k v a -> Map k v -> (a, Map k v)
forall k v a. Memo k v a -> Map k v -> (a, Map k v)
`runMemo` Map k v
forall k a. Map k a
M.empty)
startEvalMemo :: Memo k v a -> a
startEvalMemo :: Memo k v a -> a
startEvalMemo = (Memo k v a -> Map k v -> a
forall k v a. Memo k v a -> Map k v -> a
`evalMemo` Map k v
forall k a. Map k a
M.empty)