on master help sign in
Remove MonadState/MonadReader/MonadWriter
commit0fa689d16389238b6245f2b43bc2cabde9c891d0 authorAndrzej Rybczak <andrzej@rybczak.net> dateFri 9 Jul 2021, 00:00 (5 years ago) parentc7ef196
4 files changed−119
effectful.cabal−4 src/Effectful/Class/Reader.hs−34 src/Effectful/Class/State.hs−46 src/Effectful/Class/Writer.hs−35
effectful.cabal−4
@@ -71,7 +71,6 @@ library
7171 , primitive
7272 , resourcet
7373 , stm
74− , transformers
7574 , transformers-base
7675 , unliftio-core
7776
@@ -79,9 +78,6 @@ library
7978
8079 exposed-modules: Effectful
8180 Effectful.Async
82− Effectful.Class.Reader
83− Effectful.Class.State
84− Effectful.Class.Writer
8581 Effectful.Error
8682 Effectful.Fail
8783 Effectful.Internal.Effect
src/Effectful/Class/Reader.hsdeleted−34
@@ -1,34 +0,0 @@
1−{-# LANGUAGE UndecidableInstances #-}
2−module Effectful.Class.Reader
3− ( MonadReader(..)
4− , asks
5− ) where
6−
7−import Control.Monad.Trans.Class
8−import Control.Monad.Trans.Control
9−
10−import Effectful.Internal.Effect
11−import Effectful.Internal.Monad
12−import qualified Effectful.Reader as R
13−
14−-- | Compatiblity layer for a transition period from MTL-style effect handling
15−-- to 'Effectful.Eff'.
16−class Monad m => MonadReader r m where
17− ask :: m r
18− local :: (r -> r) -> m a -> m a
19−
20−-- | Generic, overlappable instance.
21−instance {-# OVERLAPPABLE #-}
22− ( MonadReader r m
23− , MonadTransControl t
24− , Monad (t m)
25− ) => MonadReader r (t m) where
26− ask = lift ask
27− local f m = liftWith (\run -> local f (run m)) >>= restoreT . pure
28−
29−instance R.Reader r :> es => MonadReader r (Eff es) where
30− ask = R.ask
31− local = R.local
32−
33−asks :: MonadReader r m => (r -> a) -> m a
34−asks f = f <$> ask
src/Effectful/Class/State.hsdeleted−46
@@ -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))
src/Effectful/Class/Writer.hsdeleted−35
@@ -1,35 +0,0 @@
1−{-# LANGUAGE UndecidableInstances #-}
2−module Effectful.Class.Writer where
3−
4−import Control.Monad.Trans.Class
5−import Control.Monad.Trans.Control
6−
7−import Effectful.Internal.Effect
8−import Effectful.Internal.Monad
9−import qualified Effectful.Writer.Dynamic as W
10−
11−-- | Compatiblity layer for a transition period from MTL-style effect handling
12−-- to 'Effectful.Eff'.
13−class Monad m => MonadWriter w m where
14− tell :: w -> m ()
15− listen :: m a -> m (a, w)
16−
17−-- | Generic, overlappable instance.
18−instance {-# OVERLAPPABLE #-}
19− ( MonadWriter w m
20− , MonadTransControl t
21− , Monad (t m)
22− ) => MonadWriter w (t m) where
23− tell = lift . tell
24− listen m = do
25− (stT, w) <- liftWith $ \run -> listen (run m)
26− (, w) <$> restoreT (pure stT)
27−
28−instance (W.Writer w :> es, Monoid w) => MonadWriter w (Eff es) where
29− tell = W.tell
30− listen = W.listen
31−
32−listens :: MonadWriter w m => (w -> b) -> m a -> m (a, b)
33−listens f m = do
34− (a, w) <- listen m
35− pure (a, f w)