on master help sign in
Class modules
commit1a825a2b6c43a0940df617a7b006ff3a61c3ec2c authorIndex Int <vlad.z.4096@gmail.com> dateSat 13 Jun 2015, 13:08 (11 years ago) parent1ed0066
9 files changed+538−505
ether.cabal+4 src/Control/Monad/Ether/Except.hs+1−101 src/Control/Monad/Ether/Except/Class.hs+106 src/Control/Monad/Ether/Reader.hs+1−130 src/Control/Monad/Ether/Reader/Class.hs+136 src/Control/Monad/Ether/State.hs+1−137 src/Control/Monad/Ether/State/Class.hs+144 src/Control/Monad/Ether/Writer.hs+1−137 src/Control/Monad/Ether/Writer/Class.hs+144
ether.cabal+4
@@ -31,9 +31,13 @@ library
3131 Control.Monad.Trans.Ether.State
3232 Control.Monad.Trans.Ether.Except
3333 Control.Monad.Ether.Reader
34+ Control.Monad.Ether.Reader.Class
3435 Control.Monad.Ether.Writer
36+ Control.Monad.Ether.Writer.Class
3537 Control.Monad.Ether.State
38+ Control.Monad.Ether.State.Class
3639 Control.Monad.Ether.Except
40+ Control.Monad.Ether.Except.Class
3741 Control.Monad.Ether.Implicit.Reader
3842 Control.Monad.Ether.Implicit.Writer
3943 Control.Monad.Ether.Implicit.State
src/Control/Monad/Ether/Except.hs+1−101
@@ -1,15 +1,3 @@
1−{-# LANGUAGE MultiParamTypeClasses #-}
2−{-# LANGUAGE TypeFamilies #-}
3−{-# LANGUAGE FlexibleInstances #-}
4−{-# LANGUAGE FlexibleContexts #-}
5−{-# LANGUAGE UndecidableInstances #-}
6−{-# LANGUAGE DataKinds #-}
7−{-# LANGUAGE ConstraintKinds #-}
8−{-# LANGUAGE TypeOperators #-}
9−{-# LANGUAGE FunctionalDependencies #-}
10−{-# LANGUAGE ScopedTypeVariables #-}
11−{-# LANGUAGE RankNTypes #-}
12−{-# LANGUAGE GeneralizedNewtypeDeriving #-}
131module Control.Monad.Ether.Except
142 (
153 -- * MonadExcept class
@@ -24,93 +12,5 @@ module Control.Monad.Ether.Except
2412 , mapExceptT
2513 ) where
2614
27−import Data.Proxy (Proxy(Proxy))
28−import Control.Monad.Trans (lift)
29−
15+import Control.Monad.Ether.Except.Class
3016import Control.Monad.Trans.Ether.Except hiding (throw, catch)
31−import qualified Control.Monad.Trans.Ether.Except as E
32−import qualified Control.Monad.Trans.Ether.Reader as R
33−import qualified Control.Monad.Trans.Ether.Writer as W
34−import qualified Control.Monad.Trans.Ether.State as S
35−import qualified Control.Ether.Util as Util
36−
37−-- for mtl instances
38−import qualified Control.Monad.Trans.Except as Trans.E
39−import qualified Control.Monad.Trans.Identity as Trans.I
40−import qualified Control.Monad.Trans.List as Trans.L
41−import qualified Control.Monad.Trans.Maybe as Trans.M
42−import qualified Control.Monad.Trans.Reader as Trans.R
43−import qualified Control.Monad.Trans.State.Lazy as Trans.S.Lazy
44−import qualified Control.Monad.Trans.State.Strict as Trans.S.Strict
45−import qualified Control.Monad.Trans.Writer.Lazy as Trans.W.Lazy
46−import qualified Control.Monad.Trans.Writer.Strict as Trans.W.Strict
47−
48−class Monad m => MonadExcept tag e m | m tag -> e where
49−
50− -- | Is used within a monadic computation to begin exception processing.
51− throw :: proxy tag -> e -> m a
52−
53− -- | A handler function to handle previous exceptions and return to
54− -- normal execution.
55− catch :: proxy tag -> m a -> (e -> m a) -> m a
56−
57−instance {-# OVERLAPPING #-} Monad m => MonadExcept tag e (ExceptT tag e m) where
58− throw = E.throw
59− catch = E.catch
60−
61−instance MonadExcept tag e m => MonadExcept tag e (ExceptT tag' e' m) where
62− throw t = lift . throw t
63− catch t = liftCatch Proxy (catch t)
64−
65−-- Instances for other tagged transformers
66−
67−instance MonadExcept tag e m => MonadExcept tag e (R.ReaderT tag' r m) where
68− throw t = lift . throw t
69− catch t = R.liftCatch Proxy (catch t)
70−
71−instance (Monoid w, MonadExcept tag e m) => MonadExcept tag e (W.WriterT tag' w m) where
72− throw t = lift . throw t
73− catch t = W.liftCatch Proxy (catch t)
74−
75−instance MonadExcept tag e m => MonadExcept tag e (S.StateT tag' s m) where
76− throw t = lift . throw t
77− catch t = S.liftCatch Proxy (catch t)
78−
79−
80−-- Instances for mtl transformers
81−
82−instance MonadExcept tag e m => MonadExcept tag e (Trans.E.ExceptT e' m) where
83− throw t = lift . throw t
84− catch t = Util.liftCatch_ExceptT (catch t)
85−
86−instance MonadExcept tag e m => MonadExcept tag e (Trans.I.IdentityT m) where
87− throw t = lift . throw t
88− catch t = Trans.I.liftCatch (catch t)
89−
90−instance MonadExcept tag e m => MonadExcept tag e (Trans.L.ListT m) where
91− throw t = lift . throw t
92− catch t = Trans.L.liftCatch (catch t)
93−
94−instance MonadExcept tag e m => MonadExcept tag e (Trans.M.MaybeT m) where
95− throw t = lift . throw t
96− catch t = Trans.M.liftCatch (catch t)
97−
98−instance MonadExcept tag e m => MonadExcept tag e (Trans.R.ReaderT r m) where
99− throw t = lift . throw t
100− catch t = Trans.R.liftCatch (catch t)
101−
102−instance MonadExcept tag e m => MonadExcept tag e (Trans.S.Lazy.StateT s m) where
103− throw t = lift . throw t
104− catch t = Trans.S.Lazy.liftCatch (catch t)
105−
106−instance MonadExcept tag e m => MonadExcept tag e (Trans.S.Strict.StateT s m) where
107− throw t = lift . throw t
108− catch t = Trans.S.Strict.liftCatch (catch t)
109−
110−instance (Monoid w, MonadExcept tag e m) => MonadExcept tag e (Trans.W.Lazy.WriterT w m) where
111− throw t = lift . throw t
112− catch t = Trans.W.Lazy.liftCatch (catch t)
113−
114−instance (Monoid w, MonadExcept tag e m) => MonadExcept tag e (Trans.W.Strict.WriterT w m) where
115− throw t = lift . throw t
116− catch t = Trans.W.Strict.liftCatch (catch t)
src/Control/Monad/Ether/Except/Class.hsnew file+106
@@ -0,0 +1,106 @@
1+{-# LANGUAGE MultiParamTypeClasses #-}
2+{-# LANGUAGE TypeFamilies #-}
3+{-# LANGUAGE FlexibleInstances #-}
4+{-# LANGUAGE FlexibleContexts #-}
5+{-# LANGUAGE UndecidableInstances #-}
6+{-# LANGUAGE DataKinds #-}
7+{-# LANGUAGE ConstraintKinds #-}
8+{-# LANGUAGE TypeOperators #-}
9+{-# LANGUAGE FunctionalDependencies #-}
10+{-# LANGUAGE ScopedTypeVariables #-}
11+{-# LANGUAGE RankNTypes #-}
12+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
13+module Control.Monad.Ether.Except.Class
14+ ( MonadExcept(..)
15+ ) where
16+
17+import Data.Proxy (Proxy(Proxy))
18+import Control.Monad.Trans (lift)
19+
20+import Control.Monad.Trans.Ether.Except hiding (throw, catch)
21+import qualified Control.Monad.Trans.Ether.Except as E
22+import qualified Control.Monad.Trans.Ether.Reader as R
23+import qualified Control.Monad.Trans.Ether.Writer as W
24+import qualified Control.Monad.Trans.Ether.State as S
25+import qualified Control.Ether.Util as Util
26+
27+-- for mtl instances
28+import qualified Control.Monad.Trans.Except as Trans.E
29+import qualified Control.Monad.Trans.Identity as Trans.I
30+import qualified Control.Monad.Trans.List as Trans.L
31+import qualified Control.Monad.Trans.Maybe as Trans.M
32+import qualified Control.Monad.Trans.Reader as Trans.R
33+import qualified Control.Monad.Trans.State.Lazy as Trans.S.Lazy
34+import qualified Control.Monad.Trans.State.Strict as Trans.S.Strict
35+import qualified Control.Monad.Trans.Writer.Lazy as Trans.W.Lazy
36+import qualified Control.Monad.Trans.Writer.Strict as Trans.W.Strict
37+
38+class Monad m => MonadExcept tag e m | m tag -> e where
39+
40+ -- | Is used within a monadic computation to begin exception processing.
41+ throw :: proxy tag -> e -> m a
42+
43+ -- | A handler function to handle previous exceptions and return to
44+ -- normal execution.
45+ catch :: proxy tag -> m a -> (e -> m a) -> m a
46+
47+instance {-# OVERLAPPING #-} Monad m => MonadExcept tag e (ExceptT tag e m) where
48+ throw = E.throw
49+ catch = E.catch
50+
51+instance MonadExcept tag e m => MonadExcept tag e (ExceptT tag' e' m) where
52+ throw t = lift . throw t
53+ catch t = liftCatch Proxy (catch t)
54+
55+-- Instances for other tagged transformers
56+
57+instance MonadExcept tag e m => MonadExcept tag e (R.ReaderT tag' r m) where
58+ throw t = lift . throw t
59+ catch t = R.liftCatch Proxy (catch t)
60+
61+instance (Monoid w, MonadExcept tag e m) => MonadExcept tag e (W.WriterT tag' w m) where
62+ throw t = lift . throw t
63+ catch t = W.liftCatch Proxy (catch t)
64+
65+instance MonadExcept tag e m => MonadExcept tag e (S.StateT tag' s m) where
66+ throw t = lift . throw t
67+ catch t = S.liftCatch Proxy (catch t)
68+
69+
70+-- Instances for mtl transformers
71+
72+instance MonadExcept tag e m => MonadExcept tag e (Trans.E.ExceptT e' m) where
73+ throw t = lift . throw t
74+ catch t = Util.liftCatch_ExceptT (catch t)
75+
76+instance MonadExcept tag e m => MonadExcept tag e (Trans.I.IdentityT m) where
77+ throw t = lift . throw t
78+ catch t = Trans.I.liftCatch (catch t)
79+
80+instance MonadExcept tag e m => MonadExcept tag e (Trans.L.ListT m) where
81+ throw t = lift . throw t
82+ catch t = Trans.L.liftCatch (catch t)
83+
84+instance MonadExcept tag e m => MonadExcept tag e (Trans.M.MaybeT m) where
85+ throw t = lift . throw t
86+ catch t = Trans.M.liftCatch (catch t)
87+
88+instance MonadExcept tag e m => MonadExcept tag e (Trans.R.ReaderT r m) where
89+ throw t = lift . throw t
90+ catch t = Trans.R.liftCatch (catch t)
91+
92+instance MonadExcept tag e m => MonadExcept tag e (Trans.S.Lazy.StateT s m) where
93+ throw t = lift . throw t
94+ catch t = Trans.S.Lazy.liftCatch (catch t)
95+
96+instance MonadExcept tag e m => MonadExcept tag e (Trans.S.Strict.StateT s m) where
97+ throw t = lift . throw t
98+ catch t = Trans.S.Strict.liftCatch (catch t)
99+
100+instance (Monoid w, MonadExcept tag e m) => MonadExcept tag e (Trans.W.Lazy.WriterT w m) where
101+ throw t = lift . throw t
102+ catch t = Trans.W.Lazy.liftCatch (catch t)
103+
104+instance (Monoid w, MonadExcept tag e m) => MonadExcept tag e (Trans.W.Strict.WriterT w m) where
105+ throw t = lift . throw t
106+ catch t = Trans.W.Strict.liftCatch (catch t)
src/Control/Monad/Ether/Reader.hs+1−130
@@ -1,15 +1,3 @@
1−{-# LANGUAGE MultiParamTypeClasses #-}
2−{-# LANGUAGE TypeFamilies #-}
3−{-# LANGUAGE FlexibleInstances #-}
4−{-# LANGUAGE FlexibleContexts #-}
5−{-# LANGUAGE UndecidableInstances #-}
6−{-# LANGUAGE DataKinds #-}
7−{-# LANGUAGE ConstraintKinds #-}
8−{-# LANGUAGE TypeOperators #-}
9−{-# LANGUAGE FunctionalDependencies #-}
10−{-# LANGUAGE ScopedTypeVariables #-}
11−{-# LANGUAGE RankNTypes #-}
12−{-# LANGUAGE GeneralizedNewtypeDeriving #-}
131module Control.Monad.Ether.Reader
142 (
153 -- * MonadReader class
@@ -25,122 +13,5 @@ module Control.Monad.Ether.Reader
2513 , mapReaderT
2614 ) where
2715
28−import Data.Proxy (Proxy(Proxy))
29−import Control.Monad.Trans (lift)
30−
31−import Control.Monad.Trans.Ether.Writer (WriterT, mapWriterT)
32−import Control.Monad.Trans.Ether.State (StateT , mapStateT)
33−import Control.Monad.Trans.Ether.Except (ExceptT, mapExceptT)
16+import Control.Monad.Ether.Reader.Class
3417import Control.Monad.Trans.Ether.Reader hiding (reader, ask, local)
35−import qualified Control.Monad.Trans.Ether.Reader as R
36−
37−-- for mtl instances
38−import qualified Control.Monad.Trans.Cont as Trans (ContT , liftLocal)
39−import qualified Control.Monad.Trans.Except as Trans (ExceptT , mapExceptT)
40−import qualified Control.Monad.Trans.Identity as Trans (IdentityT, mapIdentityT)
41−import qualified Control.Monad.Trans.List as Trans (ListT , mapListT)
42−import qualified Control.Monad.Trans.Maybe as Trans (MaybeT , mapMaybeT)
43−import qualified Control.Monad.Trans.Reader as Trans (ReaderT , mapReaderT)
44−import qualified Control.Monad.Trans.State.Lazy as Trans.Lazy (StateT , mapStateT)
45−import qualified Control.Monad.Trans.State.Strict as Trans.Strict (StateT , mapStateT)
46−import qualified Control.Monad.Trans.Writer.Lazy as Trans.Lazy (WriterT , mapWriterT)
47−import qualified Control.Monad.Trans.Writer.Strict as Trans.Strict (WriterT , mapWriterT)
48−
49−class Monad m => MonadReader tag r m | m tag -> r where
50−
51− {-# MINIMAL (ask | reader), local #-}
52−
53− -- | Retrieves the monad environment.
54− ask :: proxy tag -> m r
55− ask t = reader t id
56−
57− -- | Executes a computation in a modified environment.
58− local
59− :: proxy tag
60− -> (r -> r)
61− -- ^ The function to modify the environment.
62− -> m a
63− -- ^ @Reader@ to run in the modified environment.
64− -> m a
65−
66− -- | Retrieves a function of the current environment.
67− reader
68− :: proxy tag
69− -> (r -> a)
70− -- ^ The selector function to apply to the environment.
71− -> m a
72− reader t f = fmap f (ask t)
73−
74−-- | Retrieves a function of the current environment.
75−asks
76− :: MonadReader tag r m
77− => proxy tag
78− -> (r -> a)
79− -- ^ The selector function to apply to the environment.
80− -> m a
81−asks = reader
82−
83−instance {-# OVERLAPPING #-} Monad m => MonadReader tag r (ReaderT tag r m) where
84− ask = R.ask
85− local = R.local
86− reader = R.reader
87−
88−instance MonadReader tag r m => MonadReader tag r (ReaderT tag' r' m) where
89− ask t = lift (ask t)
90− local t = mapReaderT Proxy . local t
91−
92−-- Instances for other tagged transformers
93−
94−instance (Monoid w, MonadReader tag r m) => MonadReader tag r (WriterT tag' w m) where
95− ask t = lift (ask t)
96− local t = mapWriterT Proxy . local t
97−
98−instance (MonadReader tag r m) => MonadReader tag r (StateT tag' s m) where
99− ask t = lift (ask t)
100− local t = mapStateT Proxy . local t
101−
102−instance (MonadReader tag r m) => MonadReader tag r (ExceptT tag' e m) where
103− ask t = lift (ask t)
104− local t = mapExceptT Proxy . local t
105−
106−-- Instances for mtl transformers
107−
108−instance MonadReader tag r m => MonadReader tag r (Trans.ContT r' m) where
109− ask t = lift (ask t)
110− local t = Trans.liftLocal (ask t) (local t)
111−
112−instance MonadReader tag r m => MonadReader tag r (Trans.ExceptT e m) where
113− ask t = lift (ask t)
114− local t = Trans.mapExceptT . local t
115−
116−instance MonadReader tag r m => MonadReader tag r (Trans.IdentityT m) where
117− ask t = lift (ask t)
118− local t = Trans.mapIdentityT . local t
119−
120−instance MonadReader tag r m => MonadReader tag r (Trans.ListT m) where
121− ask t = lift (ask t)
122− local t = Trans.mapListT . local t
123−
124−instance MonadReader tag r m => MonadReader tag r (Trans.MaybeT m) where
125− ask t = lift (ask t)
126− local t = Trans.mapMaybeT . local t
127−
128−instance MonadReader tag r m => MonadReader tag r (Trans.ReaderT r' m) where
129− ask t = lift (ask t)
130− local t = Trans.mapReaderT . local t
131−
132−instance MonadReader tag r m => MonadReader tag r (Trans.Lazy.StateT s m) where
133− ask t = lift (ask t)
134− local t = Trans.Lazy.mapStateT . local t
135−
136−instance MonadReader tag r m => MonadReader tag r (Trans.Strict.StateT s m) where
137− ask t = lift (ask t)
138− local t = Trans.Strict.mapStateT . local t
139−
140−instance (Monoid w, MonadReader tag r m) => MonadReader tag r (Trans.Lazy.WriterT w m) where
141− ask t = lift (ask t)
142− local t = Trans.Lazy.mapWriterT . local t
143−
144−instance (Monoid w, MonadReader tag r m) => MonadReader tag r (Trans.Strict.WriterT w m) where
145− ask t = lift (ask t)
146− local t = Trans.Strict.mapWriterT . local t
src/Control/Monad/Ether/Reader/Class.hsnew file+136
@@ -0,0 +1,136 @@
1+{-# LANGUAGE MultiParamTypeClasses #-}
2+{-# LANGUAGE TypeFamilies #-}
3+{-# LANGUAGE FlexibleInstances #-}
4+{-# LANGUAGE FlexibleContexts #-}
5+{-# LANGUAGE UndecidableInstances #-}
6+{-# LANGUAGE DataKinds #-}
7+{-# LANGUAGE ConstraintKinds #-}
8+{-# LANGUAGE TypeOperators #-}
9+{-# LANGUAGE FunctionalDependencies #-}
10+{-# LANGUAGE ScopedTypeVariables #-}
11+{-# LANGUAGE RankNTypes #-}
12+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
13+module Control.Monad.Ether.Reader.Class
14+ ( MonadReader(..)
15+ , asks
16+ ) where
17+
18+import Data.Proxy (Proxy(Proxy))
19+import Control.Monad.Trans (lift)
20+
21+import Control.Monad.Trans.Ether.Writer (WriterT, mapWriterT)
22+import Control.Monad.Trans.Ether.State (StateT , mapStateT)
23+import Control.Monad.Trans.Ether.Except (ExceptT, mapExceptT)
24+import Control.Monad.Trans.Ether.Reader hiding (reader, ask, local)
25+import qualified Control.Monad.Trans.Ether.Reader as R
26+
27+-- for mtl instances
28+import qualified Control.Monad.Trans.Cont as Trans (ContT , liftLocal)
29+import qualified Control.Monad.Trans.Except as Trans (ExceptT , mapExceptT)
30+import qualified Control.Monad.Trans.Identity as Trans (IdentityT, mapIdentityT)
31+import qualified Control.Monad.Trans.List as Trans (ListT , mapListT)
32+import qualified Control.Monad.Trans.Maybe as Trans (MaybeT , mapMaybeT)
33+import qualified Control.Monad.Trans.Reader as Trans (ReaderT , mapReaderT)
34+import qualified Control.Monad.Trans.State.Lazy as Trans.Lazy (StateT , mapStateT)
35+import qualified Control.Monad.Trans.State.Strict as Trans.Strict (StateT , mapStateT)
36+import qualified Control.Monad.Trans.Writer.Lazy as Trans.Lazy (WriterT , mapWriterT)
37+import qualified Control.Monad.Trans.Writer.Strict as Trans.Strict (WriterT , mapWriterT)
38+
39+class Monad m => MonadReader tag r m | m tag -> r where
40+
41+ {-# MINIMAL (ask | reader), local #-}
42+
43+ -- | Retrieves the monad environment.
44+ ask :: proxy tag -> m r
45+ ask t = reader t id
46+
47+ -- | Executes a computation in a modified environment.
48+ local
49+ :: proxy tag
50+ -> (r -> r)
51+ -- ^ The function to modify the environment.
52+ -> m a
53+ -- ^ @Reader@ to run in the modified environment.
54+ -> m a
55+
56+ -- | Retrieves a function of the current environment.
57+ reader
58+ :: proxy tag
59+ -> (r -> a)
60+ -- ^ The selector function to apply to the environment.
61+ -> m a
62+ reader t f = fmap f (ask t)
63+
64+-- | Retrieves a function of the current environment.
65+asks
66+ :: MonadReader tag r m
67+ => proxy tag
68+ -> (r -> a)
69+ -- ^ The selector function to apply to the environment.
70+ -> m a
71+asks = reader
72+
73+instance {-# OVERLAPPING #-} Monad m => MonadReader tag r (ReaderT tag r m) where
74+ ask = R.ask
75+ local = R.local
76+ reader = R.reader
77+
78+instance MonadReader tag r m => MonadReader tag r (ReaderT tag' r' m) where
79+ ask t = lift (ask t)
80+ local t = mapReaderT Proxy . local t
81+
82+-- Instances for other tagged transformers
83+
84+instance (Monoid w, MonadReader tag r m) => MonadReader tag r (WriterT tag' w m) where
85+ ask t = lift (ask t)
86+ local t = mapWriterT Proxy . local t
87+
88+instance (MonadReader tag r m) => MonadReader tag r (StateT tag' s m) where
89+ ask t = lift (ask t)
90+ local t = mapStateT Proxy . local t
91+
92+instance (MonadReader tag r m) => MonadReader tag r (ExceptT tag' e m) where
93+ ask t = lift (ask t)
94+ local t = mapExceptT Proxy . local t
95+
96+-- Instances for mtl transformers
97+
98+instance MonadReader tag r m => MonadReader tag r (Trans.ContT r' m) where
99+ ask t = lift (ask t)
100+ local t = Trans.liftLocal (ask t) (local t)
101+
102+instance MonadReader tag r m => MonadReader tag r (Trans.ExceptT e m) where
103+ ask t = lift (ask t)
104+ local t = Trans.mapExceptT . local t
105+
106+instance MonadReader tag r m => MonadReader tag r (Trans.IdentityT m) where
107+ ask t = lift (ask t)
108+ local t = Trans.mapIdentityT . local t
109+
110+instance MonadReader tag r m => MonadReader tag r (Trans.ListT m) where
111+ ask t = lift (ask t)
112+ local t = Trans.mapListT . local t
113+
114+instance MonadReader tag r m => MonadReader tag r (Trans.MaybeT m) where
115+ ask t = lift (ask t)
116+ local t = Trans.mapMaybeT . local t
117+
118+instance MonadReader tag r m => MonadReader tag r (Trans.ReaderT r' m) where
119+ ask t = lift (ask t)
120+ local t = Trans.mapReaderT . local t
121+
122+instance MonadReader tag r m => MonadReader tag r (Trans.Lazy.StateT s m) where
123+ ask t = lift (ask t)
124+ local t = Trans.Lazy.mapStateT . local t
125+
126+instance MonadReader tag r m => MonadReader tag r (Trans.Strict.StateT s m) where
127+ ask t = lift (ask t)
128+ local t = Trans.Strict.mapStateT . local t
129+
130+instance (Monoid w, MonadReader tag r m) => MonadReader tag r (Trans.Lazy.WriterT w m) where
131+ ask t = lift (ask t)
132+ local t = Trans.Lazy.mapWriterT . local t
133+
134+instance (Monoid w, MonadReader tag r m) => MonadReader tag r (Trans.Strict.WriterT w m) where
135+ ask t = lift (ask t)
136+ local t = Trans.Strict.mapWriterT . local t
src/Control/Monad/Ether/State.hs+1−137
@@ -1,15 +1,3 @@
1−{-# LANGUAGE MultiParamTypeClasses #-}
2−{-# LANGUAGE TypeFamilies #-}
3−{-# LANGUAGE FlexibleInstances #-}
4−{-# LANGUAGE FlexibleContexts #-}
5−{-# LANGUAGE UndecidableInstances #-}
6−{-# LANGUAGE DataKinds #-}
7−{-# LANGUAGE ConstraintKinds #-}
8−{-# LANGUAGE TypeOperators #-}
9−{-# LANGUAGE FunctionalDependencies #-}
10−{-# LANGUAGE ScopedTypeVariables #-}
11−{-# LANGUAGE RankNTypes #-}
12−{-# LANGUAGE GeneralizedNewtypeDeriving #-}
131module Control.Monad.Ether.State
142 (
153 -- * MonadState class
@@ -30,129 +18,5 @@ module Control.Monad.Ether.State
3018 , mapStateT
3119 ) where
3220
33−import Control.Monad.Trans (lift)
34−
35−import Control.Monad.Trans.Ether.Reader (ReaderT)
36−import Control.Monad.Trans.Ether.Writer (WriterT)
37−import Control.Monad.Trans.Ether.Except (ExceptT)
21+import Control.Monad.Ether.State.Class
3822import Control.Monad.Trans.Ether.State hiding (state, get, put)
39−import qualified Control.Monad.Trans.Ether.State as S
40−
41−-- for mtl instances
42−import qualified Control.Monad.Trans.Cont as Trans (ContT)
43−import qualified Control.Monad.Trans.Except as Trans (ExceptT)
44−import qualified Control.Monad.Trans.Identity as Trans (IdentityT)
45−import qualified Control.Monad.Trans.List as Trans (ListT)
46−import qualified Control.Monad.Trans.Maybe as Trans (MaybeT)
47−import qualified Control.Monad.Trans.Reader as Trans (ReaderT)
48−import qualified Control.Monad.Trans.State.Lazy as Trans.Lazy (StateT)
49−import qualified Control.Monad.Trans.State.Strict as Trans.Strict (StateT)
50−import qualified Control.Monad.Trans.Writer.Lazy as Trans.Lazy (WriterT)
51−import qualified Control.Monad.Trans.Writer.Strict as Trans.Strict (WriterT)
52−
53−class Monad m => MonadState tag s m | m tag -> s where
54−
55− {-# MINIMAL state | get, put #-}
56−
57− -- | Return the state from the internals of the monad.
58− get :: proxy tag -> m s
59− get t = state t (\s -> (s, s))
60−
61− -- | Replace the state inside the monad.
62− put :: proxy tag -> s -> m ()
63− put t s = state t (\_ -> ((), s))
64−
65− -- | Embed a simple state action into the monad.
66− state :: proxy tag -> (s -> (a, s)) -> m a
67− state t f = do
68− s <- get t
69− let ~(a, s') = f s
70− put t s'
71− return a
72−
73−-- | Modifies the state inside a state monad.
74−modify :: MonadState tag s m => proxy tag -> (s -> s) -> m ()
75−modify t f = state t (\s -> ((), f s))
76−
77−-- | Gets specific component of the state, using a projection function supplied.
78−gets :: MonadState tag s m => proxy tag -> (s -> a) -> m a
79−gets t f = fmap f (get t)
80−
81−instance {-# OVERLAPPING #-} Monad m => MonadState tag s (StateT tag s m) where
82− get = S.get
83− put = S.put
84− state = S.state
85−
86−instance MonadState tag s m => MonadState tag s (StateT tag' s' m) where
87− get t = lift (get t)
88− put t = lift . put t
89− state t = lift . state t
90−
91−-- Instances for other tagged transformers
92−
93−instance (MonadState tag s m) => MonadState tag s (ReaderT tag' r m) where
94− get t = lift (get t)
95− put t = lift . put t
96− state t = lift . state t
97−
98−instance (Monoid w, MonadState tag s m) => MonadState tag s (WriterT tag' w m) where
99− get t = lift (get t)
100− put t = lift . put t
101− state t = lift . state t
102−
103−instance (MonadState tag s m) => MonadState tag s (ExceptT tag' e m) where
104− get t = lift (get t)
105− put t = lift . put t
106− state t = lift . state t
107−
108−-- Instances for mtl transformers
109−
110−instance MonadState tag s m => MonadState tag s (Trans.ContT r m) where
111− get t = lift (get t)
112− put t = lift . put t
113− state t = lift . state t
114−
115−instance MonadState tag s m => MonadState tag s (Trans.ExceptT e m) where
116− get t = lift (get t)
117− put t = lift . put t
118− state t = lift . state t
119−
120−instance MonadState tag s m => MonadState tag s (Trans.IdentityT m) where
121− get t = lift (get t)
122− put t = lift . put t
123− state t = lift . state t
124−
125−instance MonadState tag s m => MonadState tag s (Trans.ListT m) where
126− get t = lift (get t)
127− put t = lift . put t
128− state t = lift . state t
129−
130−instance MonadState tag s m => MonadState tag s (Trans.MaybeT m) where
131− get t = lift (get t)
132− put t = lift . put t
133− state t = lift . state t
134−
135−instance MonadState tag s m => MonadState tag s (Trans.ReaderT r m) where
136− get t = lift (get t)
137− put t = lift . put t
138− state t = lift . state t
139−
140−instance MonadState tag s m => MonadState tag s (Trans.Lazy.StateT s' m) where
141− get t = lift (get t)
142− put t = lift . put t
143− state t = lift . state t
144−
145−instance MonadState tag s m => MonadState tag s (Trans.Strict.StateT s' m) where
146− get t = lift (get t)
147− put t = lift . put t
148− state t = lift . state t
149−
150−instance (Monoid w, MonadState tag s m) => MonadState tag s (Trans.Lazy.WriterT w m) where
151− get t = lift (get t)
152− put t = lift . put t
153− state t = lift . state t
154−
155−instance (Monoid w, MonadState tag s m) => MonadState tag s (Trans.Strict.WriterT w m) where
156− get t = lift (get t)
157− put t = lift . put t
158− state t = lift . state t
src/Control/Monad/Ether/State/Class.hsnew file+144
@@ -0,0 +1,144 @@
1+{-# LANGUAGE MultiParamTypeClasses #-}
2+{-# LANGUAGE TypeFamilies #-}
3+{-# LANGUAGE FlexibleInstances #-}
4+{-# LANGUAGE FlexibleContexts #-}
5+{-# LANGUAGE UndecidableInstances #-}
6+{-# LANGUAGE DataKinds #-}
7+{-# LANGUAGE ConstraintKinds #-}
8+{-# LANGUAGE TypeOperators #-}
9+{-# LANGUAGE FunctionalDependencies #-}
10+{-# LANGUAGE ScopedTypeVariables #-}
11+{-# LANGUAGE RankNTypes #-}
12+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
13+module Control.Monad.Ether.State.Class
14+ ( MonadState(..)
15+ , modify
16+ , gets
17+ ) where
18+
19+import Control.Monad.Trans (lift)
20+
21+import Control.Monad.Trans.Ether.Reader (ReaderT)
22+import Control.Monad.Trans.Ether.Writer (WriterT)
23+import Control.Monad.Trans.Ether.Except (ExceptT)
24+import Control.Monad.Trans.Ether.State hiding (state, get, put)
25+import qualified Control.Monad.Trans.Ether.State as S
26+
27+-- for mtl instances
28+import qualified Control.Monad.Trans.Cont as Trans (ContT)
29+import qualified Control.Monad.Trans.Except as Trans (ExceptT)
30+import qualified Control.Monad.Trans.Identity as Trans (IdentityT)
31+import qualified Control.Monad.Trans.List as Trans (ListT)
32+import qualified Control.Monad.Trans.Maybe as Trans (MaybeT)
33+import qualified Control.Monad.Trans.Reader as Trans (ReaderT)
34+import qualified Control.Monad.Trans.State.Lazy as Trans.Lazy (StateT)
35+import qualified Control.Monad.Trans.State.Strict as Trans.Strict (StateT)
36+import qualified Control.Monad.Trans.Writer.Lazy as Trans.Lazy (WriterT)
37+import qualified Control.Monad.Trans.Writer.Strict as Trans.Strict (WriterT)
38+
39+class Monad m => MonadState tag s m | m tag -> s where
40+
41+ {-# MINIMAL state | get, put #-}
42+
43+ -- | Return the state from the internals of the monad.
44+ get :: proxy tag -> m s
45+ get t = state t (\s -> (s, s))
46+
47+ -- | Replace the state inside the monad.
48+ put :: proxy tag -> s -> m ()
49+ put t s = state t (\_ -> ((), s))
50+
51+ -- | Embed a simple state action into the monad.
52+ state :: proxy tag -> (s -> (a, s)) -> m a
53+ state t f = do
54+ s <- get t
55+ let ~(a, s') = f s
56+ put t s'
57+ return a
58+
59+-- | Modifies the state inside a state monad.
60+modify :: MonadState tag s m => proxy tag -> (s -> s) -> m ()
61+modify t f = state t (\s -> ((), f s))
62+
63+-- | Gets specific component of the state, using a projection function supplied.
64+gets :: MonadState tag s m => proxy tag -> (s -> a) -> m a
65+gets t f = fmap f (get t)
66+
67+instance {-# OVERLAPPING #-} Monad m => MonadState tag s (StateT tag s m) where
68+ get = S.get
69+ put = S.put
70+ state = S.state
71+
72+instance MonadState tag s m => MonadState tag s (StateT tag' s' m) where
73+ get t = lift (get t)
74+ put t = lift . put t
75+ state t = lift . state t
76+
77+-- Instances for other tagged transformers
78+
79+instance (MonadState tag s m) => MonadState tag s (ReaderT tag' r m) where
80+ get t = lift (get t)
81+ put t = lift . put t
82+ state t = lift . state t
83+
84+instance (Monoid w, MonadState tag s m) => MonadState tag s (WriterT tag' w m) where
85+ get t = lift (get t)
86+ put t = lift . put t
87+ state t = lift . state t
88+
89+instance (MonadState tag s m) => MonadState tag s (ExceptT tag' e m) where
90+ get t = lift (get t)
91+ put t = lift . put t
92+ state t = lift . state t
93+
94+-- Instances for mtl transformers
95+
96+instance MonadState tag s m => MonadState tag s (Trans.ContT r m) where
97+ get t = lift (get t)
98+ put t = lift . put t
99+ state t = lift . state t
100+
101+instance MonadState tag s m => MonadState tag s (Trans.ExceptT e m) where
102+ get t = lift (get t)
103+ put t = lift . put t
104+ state t = lift . state t
105+
106+instance MonadState tag s m => MonadState tag s (Trans.IdentityT m) where
107+ get t = lift (get t)
108+ put t = lift . put t
109+ state t = lift . state t
110+
111+instance MonadState tag s m => MonadState tag s (Trans.ListT m) where
112+ get t = lift (get t)
113+ put t = lift . put t
114+ state t = lift . state t
115+
116+instance MonadState tag s m => MonadState tag s (Trans.MaybeT m) where
117+ get t = lift (get t)
118+ put t = lift . put t
119+ state t = lift . state t
120+
121+instance MonadState tag s m => MonadState tag s (Trans.ReaderT r m) where
122+ get t = lift (get t)
123+ put t = lift . put t
124+ state t = lift . state t
125+
126+instance MonadState tag s m => MonadState tag s (Trans.Lazy.StateT s' m) where
127+ get t = lift (get t)
128+ put t = lift . put t
129+ state t = lift . state t
130+
131+instance MonadState tag s m => MonadState tag s (Trans.Strict.StateT s' m) where
132+ get t = lift (get t)
133+ put t = lift . put t
134+ state t = lift . state t
135+
136+instance (Monoid w, MonadState tag s m) => MonadState tag s (Trans.Lazy.WriterT w m) where
137+ get t = lift (get t)
138+ put t = lift . put t
139+ state t = lift . state t
140+
141+instance (Monoid w, MonadState tag s m) => MonadState tag s (Trans.Strict.WriterT w m) where
142+ get t = lift (get t)
143+ put t = lift . put t
144+ state t = lift . state t
src/Control/Monad/Ether/Writer.hs+1−137
@@ -1,15 +1,3 @@
1−{-# LANGUAGE MultiParamTypeClasses #-}
2−{-# LANGUAGE TypeFamilies #-}
3−{-# LANGUAGE FlexibleInstances #-}
4−{-# LANGUAGE FlexibleContexts #-}
5−{-# LANGUAGE UndecidableInstances #-}
6−{-# LANGUAGE DataKinds #-}
7−{-# LANGUAGE ConstraintKinds #-}
8−{-# LANGUAGE TypeOperators #-}
9−{-# LANGUAGE FunctionalDependencies #-}
10−{-# LANGUAGE ScopedTypeVariables #-}
11−{-# LANGUAGE RankNTypes #-}
12−{-# LANGUAGE GeneralizedNewtypeDeriving #-}
131module Control.Monad.Ether.Writer
142 (
153 -- * MonadWriter class
@@ -28,129 +16,5 @@ module Control.Monad.Ether.Writer
2816 , mapWriterT
2917 ) where
3018
31−import Data.Proxy (Proxy(Proxy))
32−import Control.Monad.Trans (lift)
33−
19+import Control.Monad.Ether.Writer.Class
3420import Control.Monad.Trans.Ether.Writer hiding (writer, tell, listen, pass)
35−import qualified Control.Monad.Trans.Ether.Reader as R
36−import qualified Control.Monad.Trans.Ether.State as S
37−import qualified Control.Monad.Trans.Ether.Except as E
38−import qualified Control.Monad.Trans.Ether.Writer as W
39−import qualified Control.Ether.Util as Util
40−
41−-- for mtl instances
42−import qualified Control.Monad.Trans.Except as Trans.E
43−import qualified Control.Monad.Trans.Identity as Trans.I
44−import qualified Control.Monad.Trans.Maybe as Trans.M
45−import qualified Control.Monad.Trans.Reader as Trans.R
46−import qualified Control.Monad.Trans.State.Lazy as Trans.S.Lazy
47−import qualified Control.Monad.Trans.State.Strict as Trans.S.Strict
48−import qualified Control.Monad.Trans.Writer.Lazy as Trans.W.Lazy
49−
50−class (Monoid w, Monad m) => MonadWriter tag w m | m tag -> w where
51−
52− {-# MINIMAL (writer | tell), listen, pass #-}
53−
54− -- | Embed a simple writer action.
55− writer :: proxy tag -> (a, w) -> m a
56− writer t ~(a, w) = do
57− tell t w
58− return a
59−
60− -- | Append a value to the accumulator within the monad.
61− tell :: proxy tag -> w -> m ()
62− tell t w = writer t ((),w)
63−
64− -- | Execute an action and add its accumulator
65− -- to the value of the computation.
66− listen :: proxy tag -> m a -> m (a, w)
67−
68− -- | Execute an action which returns a value and a function,
69− -- and return the value, applying the function to the accumulator.
70− pass :: proxy tag -> m (a, w -> w) -> m a
71−
72−listens :: MonadWriter tag w m => proxy tag -> (w -> b) -> m a -> m (a, b)
73−listens t f m = do
74− ~(a, w) <- listen t m
75− return (a, f w)
76−
77−censor :: MonadWriter tag w m => proxy tag -> (w -> w) -> m a -> m a
78−censor t f m = pass t $ do
79− a <- m
80− return (a, f)
81−
82−instance {-# OVERLAPPING #-} (Monoid w, Monad m) => MonadWriter tag w (WriterT tag w m) where
83− writer = W.writer
84− tell = W.tell
85− listen = W.listen
86− pass = W.pass
87−
88−instance (Monoid w', MonadWriter tag w m) => MonadWriter tag w (WriterT tag' w' m) where
89− writer t = lift . writer t
90− tell t = lift . tell t
91− listen t = W.liftListen Proxy (listen t)
92− pass t = W.liftPass Proxy (pass t)
93−
94−-- Instances for other tagged transformers
95−
96−instance (MonadWriter tag w m) => MonadWriter tag w (R.ReaderT tag' r m) where
97− writer t = lift . writer t
98− tell t = lift . tell t
99− listen t = R.mapReaderT Proxy (listen t)
100− pass t = R.mapReaderT Proxy (pass t)
101−
102−instance (MonadWriter tag w m) => MonadWriter tag w (E.ExceptT tag' e m) where
103− writer t = lift . writer t
104− tell t = lift . tell t
105− listen t = E.liftListen Proxy (listen t)
106− pass t = E.liftPass Proxy (pass t)
107−
108−instance (MonadWriter tag w m) => MonadWriter tag w (S.StateT tag' e m) where
109− writer t = lift . writer t
110− tell t = lift . tell t
111− listen t = S.liftListen Proxy (listen t)
112− pass t = S.liftPass Proxy (pass t)
113−
114−-- Instances for mtl transformers
115−
116−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.E.ExceptT e m) where
117− writer t = lift . writer t
118− tell t = lift . tell t
119− listen t = Trans.E.liftListen (listen t)
120− pass t = Trans.E.liftPass (pass t)
121−
122−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.I.IdentityT m) where
123− writer t = lift . writer t
124− tell t = lift . tell t
125− listen t = Trans.I.mapIdentityT (listen t)
126− pass t = Trans.I.mapIdentityT (pass t)
127−
128−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.M.MaybeT m) where
129− writer t = lift . writer t
130− tell t = lift . tell t
131− listen t = Trans.M.liftListen (listen t)
132− pass t = Trans.M.liftPass (pass t)
133−
134−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.R.ReaderT r m) where
135− writer t = lift . writer t
136− tell t = lift . tell t
137− listen t = Trans.R.mapReaderT (listen t)
138− pass t = Trans.R.mapReaderT (pass t)
139−
140−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.S.Lazy.StateT s m) where
141− writer t = lift . writer t
142− tell t = lift . tell t
143− listen t = Trans.S.Lazy.liftListen (listen t)
144− pass t = Trans.S.Lazy.liftPass (pass t)
145−
146−instance (MonadWriter tag w m) => MonadWriter tag w (Trans.S.Strict.StateT s m) where
147− writer t = lift . writer t
148− tell t = lift . tell t
149− listen t = Trans.S.Strict.liftListen (listen t)
150− pass t = Trans.S.Strict.liftPass (pass t)
151−
152−instance (Monoid w', MonadWriter tag w m) => MonadWriter tag w (Trans.W.Lazy.WriterT w' m) where
153− writer t = lift . writer t
154− tell t = lift . tell t
155− listen t = Util.liftListen_WriterT (listen t)
156− pass t = Util.liftPass_WriterT (pass t)
src/Control/Monad/Ether/Writer/Class.hsnew file+144
@@ -0,0 +1,144 @@
1+{-# LANGUAGE MultiParamTypeClasses #-}
2+{-# LANGUAGE TypeFamilies #-}
3+{-# LANGUAGE FlexibleInstances #-}
4+{-# LANGUAGE FlexibleContexts #-}
5+{-# LANGUAGE UndecidableInstances #-}
6+{-# LANGUAGE DataKinds #-}
7+{-# LANGUAGE ConstraintKinds #-}
8+{-# LANGUAGE TypeOperators #-}
9+{-# LANGUAGE FunctionalDependencies #-}
10+{-# LANGUAGE ScopedTypeVariables #-}
11+{-# LANGUAGE RankNTypes #-}
12+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
13+module Control.Monad.Ether.Writer.Class
14+ ( MonadWriter(..)
15+ , listens
16+ , censor
17+ ) where
18+
19+import Data.Proxy (Proxy(Proxy))
20+import Control.Monad.Trans (lift)
21+
22+import Control.Monad.Trans.Ether.Writer hiding (writer, tell, listen, pass)
23+import qualified Control.Monad.Trans.Ether.Reader as R
24+import qualified Control.Monad.Trans.Ether.State as S
25+import qualified Control.Monad.Trans.Ether.Except as E
26+import qualified Control.Monad.Trans.Ether.Writer as W
27+import qualified Control.Ether.Util as Util
28+
29+-- for mtl instances
30+import qualified Control.Monad.Trans.Except as Trans.E
31+import qualified Control.Monad.Trans.Identity as Trans.I
32+import qualified Control.Monad.Trans.Maybe as Trans.M
33+import qualified Control.Monad.Trans.Reader as Trans.R
34+import qualified Control.Monad.Trans.State.Lazy as Trans.S.Lazy
35+import qualified Control.Monad.Trans.State.Strict as Trans.S.Strict
36+import qualified Control.Monad.Trans.Writer.Lazy as Trans.W.Lazy
37+
38+class (Monoid w, Monad m) => MonadWriter tag w m | m tag -> w where
39+
40+ {-# MINIMAL (writer | tell), listen, pass #-}
41+
42+ -- | Embed a simple writer action.
43+ writer :: proxy tag -> (a, w) -> m a
44+ writer t ~(a, w) = do
45+ tell t w
46+ return a
47+
48+ -- | Append a value to the accumulator within the monad.
49+ tell :: proxy tag -> w -> m ()
50+ tell t w = writer t ((),w)
51+
52+ -- | Execute an action and add its accumulator
53+ -- to the value of the computation.
54+ listen :: proxy tag -> m a -> m (a, w)
55+
56+ -- | Execute an action which returns a value and a function,
57+ -- and return the value, applying the function to the accumulator.
58+ pass :: proxy tag -> m (a, w -> w) -> m a
59+
60+listens :: MonadWriter tag w m => proxy tag -> (w -> b) -> m a -> m (a, b)
61+listens t f m = do
62+ ~(a, w) <- listen t m
63+ return (a, f w)
64+
65+censor :: MonadWriter tag w m => proxy tag -> (w -> w) -> m a -> m a
66+censor t f m = pass t $ do
67+ a <- m
68+ return (a, f)
69+
70+instance {-# OVERLAPPING #-} (Monoid w, Monad m) => MonadWriter tag w (WriterT tag w m) where
71+ writer = W.writer
72+ tell = W.tell
73+ listen = W.listen
74+ pass = W.pass
75+
76+instance (Monoid w', MonadWriter tag w m) => MonadWriter tag w (WriterT tag' w' m) where
77+ writer t = lift . writer t
78+ tell t = lift . tell t
79+ listen t = W.liftListen Proxy (listen t)
80+ pass t = W.liftPass Proxy (pass t)
81+
82+-- Instances for other tagged transformers
83+
84+instance (MonadWriter tag w m) => MonadWriter tag w (R.ReaderT tag' r m) where
85+ writer t = lift . writer t
86+ tell t = lift . tell t
87+ listen t = R.mapReaderT Proxy (listen t)
88+ pass t = R.mapReaderT Proxy (pass t)
89+
90+instance (MonadWriter tag w m) => MonadWriter tag w (E.ExceptT tag' e m) where
91+ writer t = lift . writer t
92+ tell t = lift . tell t
93+ listen t = E.liftListen Proxy (listen t)
94+ pass t = E.liftPass Proxy (pass t)
95+
96+instance (MonadWriter tag w m) => MonadWriter tag w (S.StateT tag' e m) where
97+ writer t = lift . writer t
98+ tell t = lift . tell t
99+ listen t = S.liftListen Proxy (listen t)
100+ pass t = S.liftPass Proxy (pass t)
101+
102+-- Instances for mtl transformers
103+
104+instance (MonadWriter tag w m) => MonadWriter tag w (Trans.E.ExceptT e m) where
105+ writer t = lift . writer t
106+ tell t = lift . tell t
107+ listen t = Trans.E.liftListen (listen t)
108+ pass t = Trans.E.liftPass (pass t)
109+
110+instance (MonadWriter tag w m) => MonadWriter tag w (Trans.I.IdentityT m) where
111+ writer t = lift . writer t
112+ tell t = lift . tell t
113+ listen t = Trans.I.mapIdentityT (listen t)
114+ pass t = Trans.I.mapIdentityT (pass t)
115+
116+instance (MonadWriter tag w m) => MonadWriter tag w (Trans.M.MaybeT m) where
117+ writer t = lift . writer t
118+ tell t = lift . tell t
119+ listen t = Trans.M.liftListen (listen t)
120+ pass t = Trans.M.liftPass (pass t)
121+
122+instance (MonadWriter tag w m) => MonadWriter tag w (Trans.R.ReaderT r m) where
123+ writer t = lift . writer t
124+ tell t = lift . tell t
125+ listen t = Trans.R.mapReaderT (listen t)
126+ pass t = Trans.R.mapReaderT (pass t)
127+
128+instance (MonadWriter tag w m) => MonadWriter tag w (Trans.S.Lazy.StateT s m) where
129+ writer t = lift . writer t
130+ tell t = lift . tell t
131+ listen t = Trans.S.Lazy.liftListen (listen t)
132+ pass t = Trans.S.Lazy.liftPass (pass t)
133+
134+instance (MonadWriter tag w m) => MonadWriter tag w (Trans.S.Strict.StateT s m) where
135+ writer t = lift . writer t
136+ tell t = lift . tell t
137+ listen t = Trans.S.Strict.liftListen (listen t)
138+ pass t = Trans.S.Strict.liftPass (pass t)
139+
140+instance (Monoid w', MonadWriter tag w m) => MonadWriter tag w (Trans.W.Lazy.WriterT w' m) where
141+ writer t = lift . writer t
142+ tell t = lift . tell t
143+ listen t = Util.liftListen_WriterT (listen t)
144+ pass t = Util.liftPass_WriterT (pass t)