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