#if __GLASGOW_HASKELL__ < 710
#endif
module Control.Monad.Ether.Reader.Class
( MonadReader(..)
, asks
) where
import Control.Monad.Trans.Ether.Reader hiding (reader, ask, local)
import qualified Control.Monad.Trans.Ether.Reader as R
import qualified Control.Monad.Trans.Lift.Local as Lift
import qualified Control.Ether.Util as Util
class Monad m => MonadReader tag r m | m tag -> r where
ask :: proxy tag -> m r
ask t = reader t id
local
:: proxy tag
-> (r -> r)
-> m a
-> m a
reader
:: proxy tag
-> (r -> a)
-> m a
reader t f = Util.fmap f (ask t)
asks
:: MonadReader tag r m
=> proxy tag
-> (r -> a)
-> m a
asks = reader
instance Monad m => MonadReader tag r (ReaderT tag r m) where
ask = R.ask
local = R.local
reader = R.reader
instance
( Lift.LiftLocal t
, Monad (t m)
, MonadReader tag r m
) => MonadReader tag r (t m) where
ask t = Lift.lift (ask t)
local t = Lift.liftLocal (ask t) (local t)