on master help sign in
Use liftLocal from transformers-lift
29f3d4eIndex Int
.gitignore+2
@@ -1 +1,3 @@
1dist
1dist
2+.cabal-sandbox/
3+cabal.sandbox.config
ether.cabal+2
@@ -58,7 +58,9 @@ library
58
58
59 build-depends: base >=4.7 && <4.9
59 build-depends: base >=4.7 && <4.9
60 , transformers >=0.4.2
60 , transformers >=0.4.2
61+ , transformers-lift >=0.1
61 , mtl >=2.2.1
62 , mtl >=2.2.1
63+ , mmorph >=1.0.4
62 , template-haskell >=2.9
64 , template-haskell >=2.9
63 , newtype-generics >=0.4.1
65 , newtype-generics >=0.4.1
64
66
src/Control/Ether/Abbr.hs+1−1
@@ -28,7 +28,7 @@ type family ReifyAbbr (abbr :: *) (m :: * -> *) :: Constraint
28data tag --> r
28data tag --> r
29type instance ReifyAbbr (tag --> r) m = MonadReader tag r m
29type instance ReifyAbbr (tag --> r) m = MonadReader tag r m
30
30
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@
32-- to the writer accumulator tagged by @tag@, thus the arrows points
32-- to the writer accumulator tagged by @tag@, thus the arrows points
33-- from @w@ to @tag@.
33-- from @w@ to @tag@.
34data tag <-- w
34data tag <-- w
src/Control/Monad/Ether/Reader/Class.hs+7−82
@@ -21,29 +21,11 @@ module Control.Monad.Ether.Reader.Class
21import Data.Monoid
21import Data.Monoid
22#endif
22#endif
23
23
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)
29import Control.Monad.Trans.Ether.Reader hiding (reader, ask, local)
24import Control.Monad.Trans.Ether.Reader hiding (reader, ask, local)
30import qualified Control.Monad.Trans.Ether.Reader as R
25import qualified Control.Monad.Trans.Ether.Reader as R
31−import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
26+import qualified Control.Monad.Trans.Lift.Local as Lift
32−import qualified Control.Monad.Trans.Ether.State.Strict as S.S
33import qualified Control.Ether.Util as Util
27import qualified Control.Ether.Util as Util
34
28
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−
47-- | See 'Control.Monad.Reader.MonadReader'.
29-- | See 'Control.Monad.Reader.MonadReader'.
48class Monad m => MonadReader tag r m | m tag -> r where
30class Monad m => MonadReader tag r m | m tag -> r where
49
31
@@ -84,66 +66,9 @@ instance {-# OVERLAPPING #-} Monad m => MonadReader tag r (ReaderT tag r m) wher
84 local = R.local
66 local = R.local
85 reader = R.reader
67 reader = R.reader
86
68
87−instance MonadReader tag r m => MonadReader tag r (ReaderT tag' r' m) where
69+instance ( Lift.LiftLocal t
88− ask t = lift (ask t)
70+ , Monad (t m)
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
71+ , MonadReader tag r m
98− ask t = lift (ask t)
72+ ) => MonadReader tag r (t m) where
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)
73+ ask t = Lift.lift (ask t)
113− local t = Trans.liftLocal (ask t) (local t)
74+ local t = Lift.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
src/Control/Monad/Trans/Ether/Except.hs+5−1
@@ -37,6 +37,7 @@ import Control.Monad (MonadPlus)
37import Control.Monad.Fix (MonadFix)
37import Control.Monad.Fix (MonadFix)
38import Control.Monad.Trans.Class (MonadTrans, lift)
38import Control.Monad.Trans.Class (MonadTrans, lift)
39import Control.Monad.IO.Class (MonadIO)
39import Control.Monad.IO.Class (MonadIO)
40+import Control.Monad.Morph (MFunctor, MMonad)
40import Control.Ether.Tagged (Taggable(..), Tagged(..))
41import Control.Ether.Tagged (Taggable(..), Tagged(..))
41import qualified Control.Ether.Util as Util
42import qualified Control.Ether.Util as Util
42import GHC.Generics (Generic)
43import GHC.Generics (Generic)
@@ -44,6 +45,7 @@ import qualified Control.Newtype as NT
44
45
45import qualified Control.Monad.Signatures as Sig
46import qualified Control.Monad.Signatures as Sig
46import qualified Control.Monad.Trans.Except as Trans
47import qualified Control.Monad.Trans.Except as Trans
48+import qualified Control.Monad.Trans.Lift.Local as Lift
47
49
48import qualified Control.Monad.Cont.Class as Class
50import qualified Control.Monad.Cont.Class as Class
49import qualified Control.Monad.Reader.Class as Class
51import qualified Control.Monad.Reader.Class as Class
@@ -72,10 +74,12 @@ runExcept t = Trans.runExcept . untagged t
72newtype ExceptT tag e m a = ExceptT (Trans.ExceptT e m a)
74newtype ExceptT tag e m a = ExceptT (Trans.ExceptT e m a)
73 deriving ( Generic
75 deriving ( Generic
74 , Functor, Applicative, Alternative, Monad, MonadPlus
76 , Functor, Applicative, Alternative, Monad, MonadPlus
75− , MonadFix, MonadTrans, MonadIO )
77+ , MonadFix, MonadTrans, MonadIO, MFunctor, MMonad )
76
78
77instance NT.Newtype (ExceptT tag e m a)
79instance NT.Newtype (ExceptT tag e m a)
78
80
81+instance Lift.LiftLocal (ExceptT tag e)
82+
79instance Taggable (ExceptT tag e m) where
83instance Taggable (ExceptT tag e m) where
80 type Tag (ExceptT tag e m) = 'Just tag
84 type Tag (ExceptT tag e m) = 'Just tag
81 type Inner (ExceptT tag e m) = 'Just m
85 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)
36import Control.Monad.Fix (MonadFix)
36import Control.Monad.Fix (MonadFix)
37import Control.Monad.Trans.Class (MonadTrans, lift)
37import Control.Monad.Trans.Class (MonadTrans, lift)
38import Control.Monad.IO.Class (MonadIO)
38import Control.Monad.IO.Class (MonadIO)
39+import Control.Monad.Morph (MFunctor, MMonad)
39import Control.Ether.Tagged (Taggable(..), Tagged(..))
40import Control.Ether.Tagged (Taggable(..), Tagged(..))
40import GHC.Generics (Generic)
41import GHC.Generics (Generic)
41import qualified Control.Newtype as NT
42import qualified Control.Newtype as NT
42
43
43import qualified Control.Monad.Signatures as Sig
44import qualified Control.Monad.Signatures as Sig
44import qualified Control.Monad.Trans.Reader as Trans
45import qualified Control.Monad.Trans.Reader as Trans
46+import qualified Control.Monad.Trans.Lift.Local as Lift
45
47
46import qualified Control.Monad.Cont.Class as Class
48import qualified Control.Monad.Cont.Class as Class
47import qualified Control.Monad.Reader.Class as Class
49import qualified Control.Monad.Reader.Class as Class
@@ -65,10 +67,12 @@ type Reader tag r = ReaderT tag r Identity
65newtype ReaderT tag r m a = ReaderT (Trans.ReaderT r m a)
67newtype ReaderT tag r m a = ReaderT (Trans.ReaderT r m a)
66 deriving ( Generic
68 deriving ( Generic
67 , Functor, Applicative, Alternative, Monad, MonadPlus
69 , Functor, Applicative, Alternative, Monad, MonadPlus
68− , MonadFix, MonadTrans, MonadIO )
70+ , MonadFix, MonadTrans, MonadIO, MFunctor, MMonad )
69
71
70instance NT.Newtype (ReaderT tag r m a)
72instance NT.Newtype (ReaderT tag r m a)
71
73
74+instance Lift.LiftLocal (ReaderT tag r)
75+
72instance Taggable (ReaderT tag r m) where
76instance Taggable (ReaderT tag r m) where
73 type Tag (ReaderT tag r m) = 'Just tag
77 type Tag (ReaderT tag r m) = 'Just tag
74 type Inner (ReaderT tag r m) = 'Just m
78 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)
41import Control.Monad.Fix (MonadFix)
41import Control.Monad.Fix (MonadFix)
42import Control.Monad.Trans.Class (MonadTrans, lift)
42import Control.Monad.Trans.Class (MonadTrans, lift)
43import Control.Monad.IO.Class (MonadIO)
43import Control.Monad.IO.Class (MonadIO)
44+import Control.Monad.Morph (MFunctor)
44import Control.Ether.Tagged (Taggable(..), Tagged(..))
45import Control.Ether.Tagged (Taggable(..), Tagged(..))
45import GHC.Generics (Generic)
46import GHC.Generics (Generic)
46import qualified Control.Newtype as NT
47import qualified Control.Newtype as NT
47
48
48import qualified Control.Monad.Signatures as Sig
49import qualified Control.Monad.Signatures as Sig
49import qualified Control.Monad.Trans.State.Lazy as Trans
50import qualified Control.Monad.Trans.State.Lazy as Trans
51+import qualified Control.Monad.Trans.Lift.Local as Lift
50
52
51import qualified Control.Monad.Cont.Class as Class
53import qualified Control.Monad.Cont.Class as Class
52import qualified Control.Monad.Reader.Class as Class
54import qualified Control.Monad.Reader.Class as Class
@@ -70,10 +72,12 @@ type State tag r = StateT tag r Identity
70newtype StateT tag s m a = StateT (Trans.StateT s m a)
72newtype StateT tag s m a = StateT (Trans.StateT s m a)
71 deriving ( Generic
73 deriving ( Generic
72 , Functor, Applicative, Alternative, Monad, MonadPlus
74 , Functor, Applicative, Alternative, Monad, MonadPlus
73− , MonadFix, MonadTrans, MonadIO )
75+ , MonadFix, MonadTrans, MonadIO, MFunctor )
74
76
75instance NT.Newtype (StateT tag s m a)
77instance NT.Newtype (StateT tag s m a)
76
78
79+instance Lift.LiftLocal (StateT tag s)
80+
77instance Taggable (StateT tag s m) where
81instance Taggable (StateT tag s m) where
78 type Tag (StateT tag s m) = 'Just tag
82 type Tag (StateT tag s m) = 'Just tag
79 type Inner (StateT tag s m) = 'Just m
83 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)
41import Control.Monad.Fix (MonadFix)
41import Control.Monad.Fix (MonadFix)
42import Control.Monad.Trans.Class (MonadTrans, lift)
42import Control.Monad.Trans.Class (MonadTrans, lift)
43import Control.Monad.IO.Class (MonadIO)
43import Control.Monad.IO.Class (MonadIO)
44+import Control.Monad.Morph (MFunctor)
44import Control.Ether.Tagged (Taggable(..), Tagged(..))
45import Control.Ether.Tagged (Taggable(..), Tagged(..))
45import GHC.Generics (Generic)
46import GHC.Generics (Generic)
46import qualified Control.Newtype as NT
47import qualified Control.Newtype as NT
47
48
48import qualified Control.Monad.Signatures as Sig
49import qualified Control.Monad.Signatures as Sig
49import qualified Control.Monad.Trans.State.Strict as Trans
50import qualified Control.Monad.Trans.State.Strict as Trans
51+import qualified Control.Monad.Trans.Lift.Local as Lift
50
52
51import qualified Control.Monad.Cont.Class as Class
53import qualified Control.Monad.Cont.Class as Class
52import qualified Control.Monad.Reader.Class as Class
54import qualified Control.Monad.Reader.Class as Class
@@ -70,10 +72,12 @@ type State tag r = StateT tag r Identity
70newtype StateT tag s m a = StateT (Trans.StateT s m a)
72newtype StateT tag s m a = StateT (Trans.StateT s m a)
71 deriving ( Generic
73 deriving ( Generic
72 , Functor, Applicative, Alternative, Monad, MonadPlus
74 , Functor, Applicative, Alternative, Monad, MonadPlus
73− , MonadFix, MonadTrans, MonadIO )
75+ , MonadFix, MonadTrans, MonadIO, MFunctor )
74
76
75instance NT.Newtype (StateT tag s m a)
77instance NT.Newtype (StateT tag s m a)
76
78
79+instance Lift.LiftLocal (StateT tag s)
80+
77instance Taggable (StateT tag s m) where
81instance Taggable (StateT tag s m) where
78 type Tag (StateT tag s m) = 'Just tag
82 type Tag (StateT tag s m) = 'Just tag
79 type Inner (StateT tag s m) = 'Just m
83 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)
45import Control.Monad.Fix (MonadFix)
45import Control.Monad.Fix (MonadFix)
46import Control.Monad.Trans.Class (MonadTrans, lift)
46import Control.Monad.Trans.Class (MonadTrans, lift)
47import Control.Monad.IO.Class (MonadIO)
47import Control.Monad.IO.Class (MonadIO)
48+import Control.Monad.Morph (MFunctor, MMonad)
48import Control.Ether.Tagged (Taggable(..), Tagged(..))
49import Control.Ether.Tagged (Taggable(..), Tagged(..))
49import qualified Control.Ether.Util as Util
50import qualified Control.Ether.Util as Util
50import GHC.Generics (Generic)
51import GHC.Generics (Generic)
@@ -52,6 +53,7 @@ import qualified Control.Newtype as NT
52
53
53import qualified Control.Monad.Signatures as Sig
54import qualified Control.Monad.Signatures as Sig
54import qualified Control.Monad.Trans.Writer.Lazy as Trans
55import qualified Control.Monad.Trans.Writer.Lazy as Trans
56+import qualified Control.Monad.Trans.Lift.Local as Lift
55
57
56import qualified Control.Monad.Cont.Class as Class
58import qualified Control.Monad.Cont.Class as Class
57import qualified Control.Monad.Reader.Class as Class
59import qualified Control.Monad.Reader.Class as Class
@@ -74,10 +76,12 @@ type Writer tag w = WriterT tag w Identity
74newtype WriterT tag w m a = WriterT (Trans.WriterT w m a)
76newtype WriterT tag w m a = WriterT (Trans.WriterT w m a)
75 deriving ( Generic
77 deriving ( Generic
76 , Functor, Applicative, Alternative, Monad, MonadPlus
78 , Functor, Applicative, Alternative, Monad, MonadPlus
77− , MonadFix, MonadTrans, MonadIO )
79+ , MonadFix, MonadTrans, MonadIO, MFunctor, MMonad )
78
80
79instance NT.Newtype (WriterT tag w m a)
81instance NT.Newtype (WriterT tag w m a)
80
82
83+instance Monoid w => Lift.LiftLocal (WriterT tag w)
84+
81instance Taggable (WriterT tag w m) where
85instance Taggable (WriterT tag w m) where
82 type Tag (WriterT tag w m) = 'Just tag
86 type Tag (WriterT tag w m) = 'Just tag
83 type Inner (WriterT tag w m) = 'Just m
87 type Inner (WriterT tag w m) = 'Just m