monad-memo-0.5.0: Control/Monad/Trans/Memo/ReaderCache.hs
{- |
Module : Control.Monad.Trans.Memo.ReaderCache
Copyright : (c) Eduard Sergeev 2013
License : BSD-style (see the file LICENSE)
Maintainer : eduard.sergeev@gmail.com
Stability : experimental
Portability : non-portable
Generic StateCache - wrapper around `Control.Monad.Trans.Reader.ReaderT`
-}
{-# LANGUAGE NoImplicitPrelude, GeneralizedNewtypeDeriving #-}
module Control.Monad.Trans.Memo.ReaderCache
(
ReaderCache,
evalReaderCache,
container
) where
import Data.Function
import Control.Applicative
import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.Fix
import Control.Monad.Trans.Class
import Control.Monad.Trans.Reader
newtype ReaderCache c m a = ReaderCache { toReaderT :: ReaderT c m a }
deriving (Functor, Applicative, Alternative, Monad, MonadPlus, MonadFix, MonadTrans, MonadIO)
{-# INLINE evalReaderCache #-}
evalReaderCache = runReaderT . toReaderT
-- | Returns internal container
container :: Monad m => ReaderCache c m c
{-# INLINE container #-}
container = ReaderCache ask