@@ -1,46 +0,0 @@
1−{-# LANGUAGE UndecidableInstances #-}
2−module Effectful.Class.State where
3−
4−import Control.Monad.Trans.Class
5−
6−import Effectful.Internal.Effect
7−import Effectful.Internal.Monad
8−import qualified Effectful.State as S
9−
10−-- | Compatiblity layer for a transition period from MTL-style effect handling
11−-- to 'Effectful.Eff'.
12−class Monad m => MonadState s m where
13− {-# MINIMAL state | get, put #-}
14−
15− get :: m s
16− get = state (\s -> (s, s))
17−
18− put :: s -> m ()
19− put s = state (\_ -> ((), s))
20−
21− state :: (s -> (a, s)) -> m a
22− state f = do
23− (a, s) <- f <$> get
24− s `seq` put s
25− pure a
26−
27−-- | Generic, overlappable instance.
28−instance {-# OVERLAPPABLE #-}
29− ( MonadState s m
30− , MonadTrans t
31− , Monad (t m)
32− ) => MonadState s (t m) where
33− get = lift get
34− put = lift . put
35− state = lift . state
36−
37−instance S.State s :> es => MonadState s (Eff es) where
38− get = S.get
39− put = S.put
40− state = S.state
41−
42−gets :: MonadState s m => (s -> a) -> m a
43−gets f = f <$> get
44−
45−modify :: MonadState s m => (s -> s) -> m ()
46−modify f = state (\s -> ((), f s))