@@ -22,25 +22,10 @@ module Control.Monad.Ether.Writer.Class
2222import Data.Monoid
2323#endif
2424
25−import Data.Proxy (Proxy(Proxy))
26−import Control.Monad.Trans (lift)
27−
2825import Control.Monad.Trans.Ether.Writer hiding (writer, tell, listen, pass)
29−import qualified Control.Monad.Trans.Ether.Reader as R
30−import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
31−import qualified Control.Monad.Trans.Ether.State.Strict as S.S
32−import qualified Control.Monad.Trans.Ether.Except as E
3326import qualified Control.Monad.Trans.Ether.Writer as W
34−import qualified Control.Ether.Util as Util
35−
36−-- for mtl instances
37−import qualified Control.Monad.Trans.Except as Trans.E
38−import qualified Control.Monad.Trans.Identity as Trans.I
39−import qualified Control.Monad.Trans.Maybe as Trans.M
40−import qualified Control.Monad.Trans.Reader as Trans.R
41−import qualified Control.Monad.Trans.State.Lazy as Trans.S.Lazy
42−import qualified Control.Monad.Trans.State.Strict as Trans.S.Strict
43−import qualified Control.Monad.Trans.Writer.Lazy as Trans.W.Lazy
27+import qualified Control.Monad.Trans.Lift.Listen as Lift
28+import qualified Control.Monad.Trans.Lift.Pass as Lift
4429
4530-- | See 'Control.Monad.Writer.MonadWriter'.
4631class (Monoid w, Monad m) => MonadWriter tag w m | m tag -> w where
@@ -84,78 +69,13 @@ instance {-# OVERLAPPING #-} (Monoid w, Monad m) => MonadWriter tag w (WriterT t
8469 listen = W.listen
8570 pass = W.pass
8671
87−instance (Monoid w', MonadWriter tag w m) => MonadWriter tag w (WriterT tag' w' m) where
88− writer t = lift . writer t
89− tell t = lift . tell t
90− listen t = W.liftListen Proxy (listen t)
91− pass t = W.liftPass Proxy (pass t)
92−
93−-- Instances for other tagged transformers
94−
95−instance (MonadWriter tag w m) => MonadWriter tag w (R.ReaderT tag' r m) where
96− writer t = lift . writer t
97− tell t = lift . tell t
98− listen t = R.mapReaderT Proxy (listen t)
99− pass t = R.mapReaderT Proxy (pass t)
100−
101−instance (MonadWriter tag w m) => MonadWriter tag w (E.ExceptT tag' e m) where
102− writer t = lift . writer t
103− tell t = lift . tell t
104− listen t = E.liftListen Proxy (listen t)
105− pass t = E.liftPass Proxy (pass t)
106−
107−instance (MonadWriter tag w m) => MonadWriter tag w (S.L.StateT tag' e m) where
108− writer t = lift . writer t
109− tell t = lift . tell t
110− listen t = S.L.liftListen Proxy (listen t)
111− pass t = S.L.liftPass Proxy (pass t)
112−
113−instance (MonadWriter tag w m) => MonadWriter tag w (S.S.StateT tag' e m) where
114− writer t = lift . writer t
115− tell t = lift . tell t
116− listen t = S.S.liftListen Proxy (listen t)
117− pass t = S.S.liftPass Proxy (pass t)
118−
119−-- Instances for mtl transformers
120−
121−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.E.ExceptT e m) where
122− writer t = lift . writer t
123− tell t = lift . tell t
124− listen t = Trans.E.liftListen (listen t)
125− pass t = Trans.E.liftPass (pass t)
126−
127−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.I.IdentityT m) where
128− writer t = lift . writer t
129− tell t = lift . tell t
130− listen t = Trans.I.mapIdentityT (listen t)
131− pass t = Trans.I.mapIdentityT (pass t)
132−
133−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.M.MaybeT m) where
134− writer t = lift . writer t
135− tell t = lift . tell t
136− listen t = Trans.M.liftListen (listen t)
137− pass t = Trans.M.liftPass (pass t)
138−
139−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.R.ReaderT r m) where
140− writer t = lift . writer t
141− tell t = lift . tell t
142− listen t = Trans.R.mapReaderT (listen t)
143− pass t = Trans.R.mapReaderT (pass t)
144−
145−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.S.Lazy.StateT s m) where
146− writer t = lift . writer t
147− tell t = lift . tell t
148− listen t = Trans.S.Lazy.liftListen (listen t)
149− pass t = Trans.S.Lazy.liftPass (pass t)
150−
151−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.S.Strict.StateT s m) where
152− writer t = lift . writer t
153− tell t = lift . tell t
154− listen t = Trans.S.Strict.liftListen (listen t)
155− pass t = Trans.S.Strict.liftPass (pass t)
156−
157−instance (Monoid w', MonadWriter tag w m) => MonadWriter tag w (Trans.W.Lazy.WriterT w' m) where
158− writer t = lift . writer t
159− tell t = lift . tell t
160− listen t = Util.liftListen_WriterT (listen t)
161− pass t = Util.liftPass_WriterT (pass t)
72+instance ( Lift.LiftListen t
73+ , Lift.LiftPass t
74+ , Monad (t m)
75+ , MonadWriter tag w m
76+ , Monoid w
77+ ) => MonadWriter tag w (t m) where
78+ writer t = Lift.lift . writer t
79+ tell t = Lift.lift . tell t
80+ listen t = Lift.liftListen (listen t)
81+ pass t = Lift.liftPass (pass t)