on master help sign in
Use OVERLAPPABLE instead of OVERLAPPING
672b28fIndex Int
CHANGELOG.md+7
@@ -1,3 +1,9 @@
1+0.3.1.0
2+-------
3+
4+* Fix an issue with overlapping instances.
5+
6+
10.3.0.0
70.3.0.0
2-------
8-------
3
9
@@ -5,6 +11,7 @@
5* `MFunctor`, `MMonad` instances.
11* `MFunctor`, `MMonad` instances.
6* Use `transformers-lift`.
12* Use `transformers-lift`.
7
13
14+
80.2.1.0
150.2.1.0
9-------
16-------
10
17
README.md+1−1
@@ -11,7 +11,7 @@ monad transformers and classes in a compatible way.
11
11
12## Installation
12## Installation
13
13
14−You can install `ether 0.3.0.0`
14+You can install `ether 0.3.1.0`
15
15
161. using Cabal, from Hackage;
161. using Cabal, from Hackage;
172. using Stack, from Stackage;
172. using Stack, from Stackage;
ether.cabal+1−1
@@ -1,5 +1,5 @@
1name: ether
1name: ether
2−version: 0.3.0.0
2+version: 0.3.1.0
3synopsis: Monad transformers and classes
3synopsis: Monad transformers and classes
4description:
4description:
5 Ether is a Haskell library that extends @mtl@ and @transformers@ with
5 Ether is a Haskell library that extends @mtl@ and @transformers@ with
src/Control/Monad/Ether/Except/Class.hs+3−2
@@ -31,11 +31,12 @@ class Monad m => MonadExcept tag e m | m tag -> e where
31 -- normal execution.
31 -- normal execution.
32 catch :: proxy tag -> m a -> (e -> m a) -> m a
32 catch :: proxy tag -> m a -> (e -> m a) -> m a
33
33
34−instance {-# OVERLAPPING #-} Monad m => MonadExcept tag e (ExceptT tag e m) where
34+instance Monad m => MonadExcept tag e (ExceptT tag e m) where
35 throw = E.throw
35 throw = E.throw
36 catch = E.catch
36 catch = E.catch
37
37
38+instance {-# OVERLAPPABLE #-}
38−instance ( Lift.LiftCatch t
39+ ( Lift.LiftCatch t
39 , Monad (t m)
40 , Monad (t m)
40 , MonadExcept tag e m
41 , MonadExcept tag e m
41 ) => MonadExcept tag e (t m) where
42 ) => MonadExcept tag e (t m) where
src/Control/Monad/Ether/Reader/Class.hs+3−2
@@ -57,12 +57,13 @@ asks
57 -> m a
57 -> m a
58asks = reader
58asks = reader
59
59
60−instance {-# OVERLAPPING #-} Monad m => MonadReader tag r (ReaderT tag r m) where
60+instance Monad m => MonadReader tag r (ReaderT tag r m) where
61 ask = R.ask
61 ask = R.ask
62 local = R.local
62 local = R.local
63 reader = R.reader
63 reader = R.reader
64
64
65+instance {-# OVERLAPPABLE #-}
65−instance ( Lift.LiftLocal t
66+ ( Lift.LiftLocal t
66 , Monad (t m)
67 , Monad (t m)
67 , MonadReader tag r m
68 , MonadReader tag r m
68 ) => MonadReader tag r (t m) where
69 ) => MonadReader tag r (t m) where
src/Control/Monad/Ether/State/Class.hs+8−93
@@ -22,27 +22,12 @@ module Control.Monad.Ether.State.Class
22import Data.Monoid
22import Data.Monoid
23#endif
23#endif
24
24
25−import Control.Monad.Trans (lift)
25+import Control.Monad.Trans (MonadTrans(..))
26
26
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
33
30
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−
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
48
33
@@ -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)
74
59
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
79
64
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
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
89
69
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
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
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
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
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
src/Control/Monad/Ether/Writer/Class.hs+3−2
@@ -63,13 +63,14 @@ censor t f m = pass t $ do
63 a <- m
63 a <- m
64 return (a, f)
64 return (a, f)
65
65
66−instance {-# OVERLAPPING #-} (Monoid w, Monad m) => MonadWriter tag w (WriterT tag w m) where
66+instance (Monoid w, Monad m) => MonadWriter tag w (WriterT tag w m) where
67 writer = W.writer
67 writer = W.writer
68 tell = W.tell
68 tell = W.tell
69 listen = W.listen
69 listen = W.listen
70 pass = W.pass
70 pass = W.pass
71
71
72+instance {-# OVERLAPPABLE #-}
72−instance ( Lift.LiftListen t
73+ ( Lift.LiftListen t
73 , Lift.LiftPass t
74 , Lift.LiftPass t
74 , Monad (t m)
75 , Monad (t m)
75 , MonadWriter tag w m
76 , MonadWriter tag w m
stack.yaml+1−1
@@ -2,4 +2,4 @@ flags: {}
2packages:
2packages:
3- '.'
3- '.'
4extra-deps: []
4extra-deps: []
5−resolver: lts-3.5
5+resolver: lts-3.9
test/Regression.hs+3
@@ -213,3 +213,6 @@ wrapStateBad2 = do
213
213
214wrapStateBad2Core :: Int -> Int
214wrapStateBad2Core :: Int -> Int
215wrapStateBad2Core = evalState foo (ensureUniqueTags $ ethered foo wrapStateBad2)
215wrapStateBad2Core = evalState foo (ensureUniqueTags $ ethered foo wrapStateBad2)
216+
217+wrapReaderCore :: Int -> Int
218+wrapReaderCore = runReader foo (ethered foo ((+) <$> T.ask <*> ask foo))