@@ -22,27 +22,12 @@ module Control.Monad.Ether.State.Class
22import Data.Monoid
22import Data.Monoid
25−import Control.Monad.Trans (lift)
25+import Control.Monad.Trans (MonadTrans(..))
27−import Control.Monad.Trans.Ether.Reader (ReaderT)
28−import Control.Monad.Trans.Ether.Writer (WriterT)
29−import Control.Monad.Trans.Ether.Except (ExceptT)
30import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
27import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
31import qualified Control.Monad.Trans.Ether.State.Strict as S.S
28import qualified Control.Monad.Trans.Ether.State.Strict as S.S
32import qualified Control.Ether.Util as Util
29import qualified Control.Ether.Util as Util
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)
46-- | See 'Control.Monad.State.MonadState'.
31-- | See 'Control.Monad.State.MonadState'.
47class Monad m => MonadState tag s m | m tag -> s where
32class Monad m => MonadState tag s m | m tag -> s where
@@ -72,91 +57,21 @@ modify t f = state t (\s -> ((), f s))
72gets :: MonadState tag s m => proxy tag -> (s -> a) -> m a
57gets :: MonadState tag s m => proxy tag -> (s -> a) -> m a
73gets t f = Util.fmap f (get t)
58gets t f = Util.fmap f (get t)
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
76 get = S.L.get
61 get = S.L.get
77 put = S.L.put
62 put = S.L.put
78 state = S.L.state
63 state = S.L.state
80−instance MonadState tag s m => MonadState tag s (S.L.StateT tag' s' m) where
83− state t = lift . state t
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
86 get = S.S.get
66 get = S.S.get
87 put = S.S.put
67 put = S.S.put
88 state = S.S.state
68 state = S.S.state
90−instance MonadState tag s m => MonadState tag s (S.S.StateT tag' s' m) where
70+instance {-# OVERLAPPABLE #-}
91− get t = lift (get t)
71+ ( MonadTrans t
92− put t = lift . put t
72+ , Monad (t m)
93− state t = lift . state t
95−-- Instances for other tagged transformers
97−instance (MonadState tag s m) => MonadState tag s (ReaderT tag' r m) where
100− state t = lift . state t
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
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
112−-- Instances for mtl transformers
114−instance MonadState tag s m => MonadState tag s (Trans.ContT r m) where
73+ , MonadState tag s m
115− get t = lift (get t)
74+ ) => MonadState tag s (t m) where
116− put t = lift . put t
117− state t = lift . state t
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
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
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
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
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
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
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
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
159−instance (Monoid w, MonadState tag s m) => MonadState tag s (Trans.Strict.WriterT w m) where
160 get t = lift (get t)
75 get t = lift (get t)
161 put t = lift . put t
76 put t = lift . put t
162 state t = lift . state t
77 state t = lift . state t