on fbc5b30 help sign in
42 lines 1.0 kB history raw
1{-# LANGUAGE UndecidableInstances #-}
2module Effectful.Class.Reader
3 ( MonadReader(..)
4 , asks
5 ) where
7import Control.Monad.Trans.Class
8import Control.Monad.Trans.Control
10import Effectful.Internal.Effect
11import Effectful.Internal.Monad
12import qualified Effectful.Reader as R
14-- | Compatiblity layer for a transition period from MTL-style effect handling
15-- to 'Effectful.Eff'.
16class Monad m => MonadReader r m where
17 {-# MINIMAL (ask | reader), local #-}
18 ask :: m r
19 ask = reader id
21 local :: (r -> r) -> m a -> m a
23 reader :: (r -> a) -> m a
24 reader f = ask >>= pure . f
26-- | Generic, overlappable instance.
27instance {-# OVERLAPPABLE #-}
28 ( MonadReader r m
29 , MonadTransControl t
30 , Monad (t m)
31 ) => MonadReader r (t m) where
32 ask = lift ask
33 local f m = liftWith (\run -> local f (run m)) >>= restoreT . pure
34 reader = lift . reader
36instance R.Reader r :> es => MonadReader r (Eff es) where
37 ask = R.ask
38 local = R.local
39 reader = R.reader
41asks :: MonadReader r m => (r -> a) -> m a
42asks = reader