(original) (raw)

{-# 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)