@@ -21,29 +21,11 @@ module Control.Monad.Ether.Reader.Class
2121import Data.Monoid
2222#endif
2323
24−import Data.Proxy (Proxy(Proxy))
25−import Control.Monad.Trans (lift)
26−
27−import Control.Monad.Trans.Ether.Writer (WriterT, mapWriterT)
28−import Control.Monad.Trans.Ether.Except (ExceptT, mapExceptT)
2924import Control.Monad.Trans.Ether.Reader hiding (reader, ask, local)
3025import qualified Control.Monad.Trans.Ether.Reader as R
31−import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
32−import qualified Control.Monad.Trans.Ether.State.Strict as S.S
26+import qualified Control.Monad.Trans.Lift.Local as Lift
3327import qualified Control.Ether.Util as Util
3428
35−-- for mtl instances
36−import qualified Control.Monad.Trans.Cont as Trans (ContT , liftLocal)
37−import qualified Control.Monad.Trans.Except as Trans (ExceptT , mapExceptT)
38−import qualified Control.Monad.Trans.Identity as Trans (IdentityT, mapIdentityT)
39−import qualified Control.Monad.Trans.List as Trans (ListT , mapListT)
40−import qualified Control.Monad.Trans.Maybe as Trans (MaybeT , mapMaybeT)
41−import qualified Control.Monad.Trans.Reader as Trans (ReaderT , mapReaderT)
42−import qualified Control.Monad.Trans.State.Lazy as Trans.Lazy (StateT , mapStateT)
43−import qualified Control.Monad.Trans.State.Strict as Trans.Strict (StateT , mapStateT)
44−import qualified Control.Monad.Trans.Writer.Lazy as Trans.Lazy (WriterT , mapWriterT)
45−import qualified Control.Monad.Trans.Writer.Strict as Trans.Strict (WriterT , mapWriterT)
46−
4729-- | See 'Control.Monad.Reader.MonadReader'.
4830class Monad m => MonadReader tag r m | m tag -> r where
4931
@@ -84,66 +66,9 @@ instance {-# OVERLAPPING #-} Monad m => MonadReader tag r (ReaderT tag r m) wher
8466 local = R.local
8567 reader = R.reader
8668
87−instance MonadReader tag r m => MonadReader tag r (ReaderT tag' r' m) where
88− ask t = lift (ask t)
89− local t = mapReaderT Proxy . local t
90−
91−-- Instances for other tagged transformers
92−
93−instance (Monoid w, MonadReader tag r m) => MonadReader tag r (WriterT tag' w m) where
94− ask t = lift (ask t)
95− local t = mapWriterT Proxy . local t
96−
97−instance (MonadReader tag r m) => MonadReader tag r (S.L.StateT tag' s m) where
98− ask t = lift (ask t)
99− local t = S.L.mapStateT Proxy . local t
100−
101−instance (MonadReader tag r m) => MonadReader tag r (S.S.StateT tag' s m) where
102− ask t = lift (ask t)
103− local t = S.S.mapStateT Proxy . local t
104−
105−instance (MonadReader tag r m) => MonadReader tag r (ExceptT tag' e m) where
106− ask t = lift (ask t)
107− local t = mapExceptT Proxy . local t
108−
109−-- Instances for mtl transformers
110−
111−instance MonadReader tag r m => MonadReader tag r (Trans.ContT r' m) where
112− ask t = lift (ask t)
113− local t = Trans.liftLocal (ask t) (local t)
114−
115−instance MonadReader tag r m => MonadReader tag r (Trans.ExceptT e m) where
116− ask t = lift (ask t)
117− local t = Trans.mapExceptT . local t
118−
119−instance MonadReader tag r m => MonadReader tag r (Trans.IdentityT m) where
120− ask t = lift (ask t)
121− local t = Trans.mapIdentityT . local t
122−
123−instance MonadReader tag r m => MonadReader tag r (Trans.ListT m) where
124− ask t = lift (ask t)
125− local t = Trans.mapListT . local t
126−
127−instance MonadReader tag r m => MonadReader tag r (Trans.MaybeT m) where
128− ask t = lift (ask t)
129− local t = Trans.mapMaybeT . local t
130−
131−instance MonadReader tag r m => MonadReader tag r (Trans.ReaderT r' m) where
132− ask t = lift (ask t)
133− local t = Trans.mapReaderT . local t
134−
135−instance MonadReader tag r m => MonadReader tag r (Trans.Lazy.StateT s m) where
136− ask t = lift (ask t)
137− local t = Trans.Lazy.mapStateT . local t
138−
139−instance MonadReader tag r m => MonadReader tag r (Trans.Strict.StateT s m) where
140− ask t = lift (ask t)
141− local t = Trans.Strict.mapStateT . local t
142−
143−instance (Monoid w, MonadReader tag r m) => MonadReader tag r (Trans.Lazy.WriterT w m) where
144− ask t = lift (ask t)
145− local t = Trans.Lazy.mapWriterT . local t
146−
147−instance (Monoid w, MonadReader tag r m) => MonadReader tag r (Trans.Strict.WriterT w m) where
148− ask t = lift (ask t)
149− local t = Trans.Strict.mapWriterT . local t
69+instance ( Lift.LiftLocal t
70+ , Monad (t m)
71+ , MonadReader tag r m
72+ ) => MonadReader tag r (t m) where
73+ ask t = Lift.lift (ask t)
74+ local t = Lift.liftLocal (ask t) (local t)