@@ -22,27 +22,12 @@ module Control.Monad.Ether.State.Class
2222import Data.Monoid
2323#endif
2424
25−import Control.Monad.Trans (lift)
25+import Control.Monad.Trans (MonadTrans(..))
2626
27−import Control.Monad.Trans.Ether.Reader (ReaderT)
28−import Control.Monad.Trans.Ether.Writer (WriterT)
29−import Control.Monad.Trans.Ether.Except (ExceptT)
3027import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
3128import qualified Control.Monad.Trans.Ether.State.Strict as S.S
3229import qualified Control.Ether.Util as Util
3330
34−-- for mtl instances
35−import qualified Control.Monad.Trans.Cont as Trans (ContT)
36−import qualified Control.Monad.Trans.Except as Trans (ExceptT)
37−import qualified Control.Monad.Trans.Identity as Trans (IdentityT)
38−import qualified Control.Monad.Trans.List as Trans (ListT)
39−import qualified Control.Monad.Trans.Maybe as Trans (MaybeT)
40−import qualified Control.Monad.Trans.Reader as Trans (ReaderT)
41−import qualified Control.Monad.Trans.State.Lazy as Trans.Lazy (StateT)
42−import qualified Control.Monad.Trans.State.Strict as Trans.Strict (StateT)
43−import qualified Control.Monad.Trans.Writer.Lazy as Trans.Lazy (WriterT)
44−import qualified Control.Monad.Trans.Writer.Strict as Trans.Strict (WriterT)
45−
4631-- | See 'Control.Monad.State.MonadState'.
4732class Monad m => MonadState tag s m | m tag -> s where
4833
@@ -72,91 +57,21 @@ modify t f = state t (\s -> ((), f s))
7257gets :: MonadState tag s m => proxy tag -> (s -> a) -> m a
7358gets t f = Util.fmap f (get t)
7459
75−instance {-# OVERLAPPING #-} Monad m => MonadState tag s (S.L.StateT tag s m) where
60+instance Monad m => MonadState tag s (S.L.StateT tag s m) where
7661 get = S.L.get
7762 put = S.L.put
7863 state = S.L.state
7964
80−instance MonadState tag s m => MonadState tag s (S.L.StateT tag' s' m) where
81− get t = lift (get t)
82− put t = lift . put t
83− state t = lift . state t
84−
85−instance {-# OVERLAPPING #-} Monad m => MonadState tag s (S.S.StateT tag s m) where
65+instance Monad m => MonadState tag s (S.S.StateT tag s m) where
8666 get = S.S.get
8767 put = S.S.put
8868 state = S.S.state
8969
90−instance MonadState tag s m => MonadState tag s (S.S.StateT tag' s' m) where
91− get t = lift (get t)
92− put t = lift . put t
93− state t = lift . state t
94−
95−-- Instances for other tagged transformers
96−
97−instance (MonadState tag s m) => MonadState tag s (ReaderT tag' r m) where
98− get t = lift (get t)
99− put t = lift . put t
100− state t = lift . state t
101−
102−instance (Monoid w, MonadState tag s m) => MonadState tag s (WriterT tag' w m) where
103− get t = lift (get t)
104− put t = lift . put t
105− state t = lift . state t
106−
107−instance (MonadState tag s m) => MonadState tag s (ExceptT tag' e m) where
108− get t = lift (get t)
109− put t = lift . put t
110− state t = lift . state t
111−
112−-- Instances for mtl transformers
113−
114−instance MonadState tag s m => MonadState tag s (Trans.ContT r m) where
115− get t = lift (get t)
116− put t = lift . put t
117− state t = lift . state t
118−
119−instance MonadState tag s m => MonadState tag s (Trans.ExceptT e m) where
120− get t = lift (get t)
121− put t = lift . put t
122− state t = lift . state t
123−
124−instance MonadState tag s m => MonadState tag s (Trans.IdentityT m) where
125− get t = lift (get t)
126− put t = lift . put t
127− state t = lift . state t
128−
129−instance MonadState tag s m => MonadState tag s (Trans.ListT m) where
130− get t = lift (get t)
131− put t = lift . put t
132− state t = lift . state t
133−
134−instance MonadState tag s m => MonadState tag s (Trans.MaybeT m) where
135− get t = lift (get t)
136− put t = lift . put t
137− state t = lift . state t
138−
139−instance MonadState tag s m => MonadState tag s (Trans.ReaderT r m) where
140− get t = lift (get t)
141− put t = lift . put t
142− state t = lift . state t
143−
144−instance MonadState tag s m => MonadState tag s (Trans.Lazy.StateT s' m) where
145− get t = lift (get t)
146− put t = lift . put t
147− state t = lift . state t
148−
149−instance MonadState tag s m => MonadState tag s (Trans.Strict.StateT s' m) where
150− get t = lift (get t)
151− put t = lift . put t
152− state t = lift . state t
153−
154−instance (Monoid w, MonadState tag s m) => MonadState tag s (Trans.Lazy.WriterT w m) where
155− get t = lift (get t)
156− put t = lift . put t
157− state t = lift . state t
158−
159−instance (Monoid w, MonadState tag s m) => MonadState tag s (Trans.Strict.WriterT w m) where
70+instance {-# OVERLAPPABLE #-}
71+ ( MonadTrans t
72+ , Monad (t m)
73+ , MonadState tag s m
74+ ) => MonadState tag s (t m) where
16075 get t = lift (get t)
16176 put t = lift . put t
16277 state t = lift . state t