on master help sign in
Use liftLocal from transformers-lift
commit29f3d4e22851b74c51bb4785b9a820ff40ff74b0 authorIndex Int <vlad.z.4096@gmail.com> dateThu 18 Jun 2015, 15:44 (11 years ago) parent79c01cf
9 files changed+37−88
.gitignore+2 ether.cabal+2 src/Control/Ether/Abbr.hs+1−1 src/Control/Monad/Ether/Reader/Class.hs+7−82 src/Control/Monad/Trans/Ether/Except.hs+5−1 src/Control/Monad/Trans/Ether/Reader.hs+5−1 src/Control/Monad/Trans/Ether/State/Lazy.hs+5−1 src/Control/Monad/Trans/Ether/State/Strict.hs+5−1 src/Control/Monad/Trans/Ether/Writer.hs+5−1
.gitignore+2
@@ -1 +1,3 @@
11dist
2+.cabal-sandbox/
3+cabal.sandbox.config
ether.cabal+2
@@ -58,7 +58,9 @@ library
5858
5959 build-depends: base >=4.7 && <4.9
6060 , transformers >=0.4.2
61+ , transformers-lift >=0.1
6162 , mtl >=2.2.1
63+ , mmorph >=1.0.4
6264 , template-haskell >=2.9
6365 , newtype-generics >=0.4.1
6466
src/Control/Ether/Abbr.hs+1−1
@@ -28,7 +28,7 @@ type family ReifyAbbr (abbr :: *) (m :: * -> *) :: Constraint
2828data tag --> r
2929type instance ReifyAbbr (tag --> r) m = MonadReader tag r m
3030
31−-- | Denotes 'MonadWriter'. The mnemonic is that you write values of @w@
31+-- | Denotes 'MonadWriter'. The mnemonic is that you write values of type @w@
3232-- to the writer accumulator tagged by @tag@, thus the arrows points
3333-- from @w@ to @tag@.
3434data tag <-- w
src/Control/Monad/Ether/Reader/Class.hs+7−82
@@ -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)
src/Control/Monad/Trans/Ether/Except.hs+5−1
@@ -37,6 +37,7 @@ import Control.Monad (MonadPlus)
3737import Control.Monad.Fix (MonadFix)
3838import Control.Monad.Trans.Class (MonadTrans, lift)
3939import Control.Monad.IO.Class (MonadIO)
40+import Control.Monad.Morph (MFunctor, MMonad)
4041import Control.Ether.Tagged (Taggable(..), Tagged(..))
4142import qualified Control.Ether.Util as Util
4243import GHC.Generics (Generic)
@@ -44,6 +45,7 @@ import qualified Control.Newtype as NT
4445
4546import qualified Control.Monad.Signatures as Sig
4647import qualified Control.Monad.Trans.Except as Trans
48+import qualified Control.Monad.Trans.Lift.Local as Lift
4749
4850import qualified Control.Monad.Cont.Class as Class
4951import qualified Control.Monad.Reader.Class as Class
@@ -72,10 +74,12 @@ runExcept t = Trans.runExcept . untagged t
7274newtype ExceptT tag e m a = ExceptT (Trans.ExceptT e m a)
7375 deriving ( Generic
7476 , Functor, Applicative, Alternative, Monad, MonadPlus
75− , MonadFix, MonadTrans, MonadIO )
77+ , MonadFix, MonadTrans, MonadIO, MFunctor, MMonad )
7678
7779instance NT.Newtype (ExceptT tag e m a)
7880
81+instance Lift.LiftLocal (ExceptT tag e)
82+
7983instance Taggable (ExceptT tag e m) where
8084 type Tag (ExceptT tag e m) = 'Just tag
8185 type Inner (ExceptT tag e m) = 'Just m
src/Control/Monad/Trans/Ether/Reader.hs+5−1
@@ -36,12 +36,14 @@ import Control.Monad (MonadPlus)
3636import Control.Monad.Fix (MonadFix)
3737import Control.Monad.Trans.Class (MonadTrans, lift)
3838import Control.Monad.IO.Class (MonadIO)
39+import Control.Monad.Morph (MFunctor, MMonad)
3940import Control.Ether.Tagged (Taggable(..), Tagged(..))
4041import GHC.Generics (Generic)
4142import qualified Control.Newtype as NT
4243
4344import qualified Control.Monad.Signatures as Sig
4445import qualified Control.Monad.Trans.Reader as Trans
46+import qualified Control.Monad.Trans.Lift.Local as Lift
4547
4648import qualified Control.Monad.Cont.Class as Class
4749import qualified Control.Monad.Reader.Class as Class
@@ -65,10 +67,12 @@ type Reader tag r = ReaderT tag r Identity
6567newtype ReaderT tag r m a = ReaderT (Trans.ReaderT r m a)
6668 deriving ( Generic
6769 , Functor, Applicative, Alternative, Monad, MonadPlus
68− , MonadFix, MonadTrans, MonadIO )
70+ , MonadFix, MonadTrans, MonadIO, MFunctor, MMonad )
6971
7072instance NT.Newtype (ReaderT tag r m a)
7173
74+instance Lift.LiftLocal (ReaderT tag r)
75+
7276instance Taggable (ReaderT tag r m) where
7377 type Tag (ReaderT tag r m) = 'Just tag
7478 type Inner (ReaderT tag r m) = 'Just m
src/Control/Monad/Trans/Ether/State/Lazy.hs+5−1
@@ -41,12 +41,14 @@ import Control.Monad (MonadPlus)
4141import Control.Monad.Fix (MonadFix)
4242import Control.Monad.Trans.Class (MonadTrans, lift)
4343import Control.Monad.IO.Class (MonadIO)
44+import Control.Monad.Morph (MFunctor)
4445import Control.Ether.Tagged (Taggable(..), Tagged(..))
4546import GHC.Generics (Generic)
4647import qualified Control.Newtype as NT
4748
4849import qualified Control.Monad.Signatures as Sig
4950import qualified Control.Monad.Trans.State.Lazy as Trans
51+import qualified Control.Monad.Trans.Lift.Local as Lift
5052
5153import qualified Control.Monad.Cont.Class as Class
5254import qualified Control.Monad.Reader.Class as Class
@@ -70,10 +72,12 @@ type State tag r = StateT tag r Identity
7072newtype StateT tag s m a = StateT (Trans.StateT s m a)
7173 deriving ( Generic
7274 , Functor, Applicative, Alternative, Monad, MonadPlus
73− , MonadFix, MonadTrans, MonadIO )
75+ , MonadFix, MonadTrans, MonadIO, MFunctor )
7476
7577instance NT.Newtype (StateT tag s m a)
7678
79+instance Lift.LiftLocal (StateT tag s)
80+
7781instance Taggable (StateT tag s m) where
7882 type Tag (StateT tag s m) = 'Just tag
7983 type Inner (StateT tag s m) = 'Just m
src/Control/Monad/Trans/Ether/State/Strict.hs+5−1
@@ -41,12 +41,14 @@ import Control.Monad (MonadPlus)
4141import Control.Monad.Fix (MonadFix)
4242import Control.Monad.Trans.Class (MonadTrans, lift)
4343import Control.Monad.IO.Class (MonadIO)
44+import Control.Monad.Morph (MFunctor)
4445import Control.Ether.Tagged (Taggable(..), Tagged(..))
4546import GHC.Generics (Generic)
4647import qualified Control.Newtype as NT
4748
4849import qualified Control.Monad.Signatures as Sig
4950import qualified Control.Monad.Trans.State.Strict as Trans
51+import qualified Control.Monad.Trans.Lift.Local as Lift
5052
5153import qualified Control.Monad.Cont.Class as Class
5254import qualified Control.Monad.Reader.Class as Class
@@ -70,10 +72,12 @@ type State tag r = StateT tag r Identity
7072newtype StateT tag s m a = StateT (Trans.StateT s m a)
7173 deriving ( Generic
7274 , Functor, Applicative, Alternative, Monad, MonadPlus
73− , MonadFix, MonadTrans, MonadIO )
75+ , MonadFix, MonadTrans, MonadIO, MFunctor )
7476
7577instance NT.Newtype (StateT tag s m a)
7678
79+instance Lift.LiftLocal (StateT tag s)
80+
7781instance Taggable (StateT tag s m) where
7882 type Tag (StateT tag s m) = 'Just tag
7983 type Inner (StateT tag s m) = 'Just m
src/Control/Monad/Trans/Ether/Writer.hs+5−1
@@ -45,6 +45,7 @@ import Control.Monad (MonadPlus)
4545import Control.Monad.Fix (MonadFix)
4646import Control.Monad.Trans.Class (MonadTrans, lift)
4747import Control.Monad.IO.Class (MonadIO)
48+import Control.Monad.Morph (MFunctor, MMonad)
4849import Control.Ether.Tagged (Taggable(..), Tagged(..))
4950import qualified Control.Ether.Util as Util
5051import GHC.Generics (Generic)
@@ -52,6 +53,7 @@ import qualified Control.Newtype as NT
5253
5354import qualified Control.Monad.Signatures as Sig
5455import qualified Control.Monad.Trans.Writer.Lazy as Trans
56+import qualified Control.Monad.Trans.Lift.Local as Lift
5557
5658import qualified Control.Monad.Cont.Class as Class
5759import qualified Control.Monad.Reader.Class as Class
@@ -74,10 +76,12 @@ type Writer tag w = WriterT tag w Identity
7476newtype WriterT tag w m a = WriterT (Trans.WriterT w m a)
7577 deriving ( Generic
7678 , Functor, Applicative, Alternative, Monad, MonadPlus
77− , MonadFix, MonadTrans, MonadIO )
79+ , MonadFix, MonadTrans, MonadIO, MFunctor, MMonad )
7880
7981instance NT.Newtype (WriterT tag w m a)
8082
83+instance Monoid w => Lift.LiftLocal (WriterT tag w)
84+
8185instance Taggable (WriterT tag w m) where
8286 type Tag (WriterT tag w m) = 'Just tag
8387 type Inner (WriterT tag w m) = 'Just m