on master help sign in
Use OVERLAPPABLE instead of OVERLAPPING

fixes #6

commit672b28f3239b438a5298c9bc85f6ffe898701588 authorIndex Int <vlad.z.4096@gmail.com> dateSun 18 Oct 2015, 06:35 (11 years ago) parent7ba6d2a
9 files changed+30−102
CHANGELOG.md+7 README.md+1−1 ether.cabal+1−1 src/Control/Monad/Ether/Except/Class.hs+3−2 src/Control/Monad/Ether/Reader/Class.hs+3−2 src/Control/Monad/Ether/State/Class.hs+8−93 src/Control/Monad/Ether/Writer/Class.hs+3−2 stack.yaml+1−1 test/Regression.hs+3
CHANGELOG.md+7
@@ -1,3 +1,9 @@
1+0.3.1.0
2+-------
3+
4+* Fix an issue with overlapping instances.
5+
6+
170.3.0.0
28-------
39
@@ -5,6 +11,7 @@
511* `MFunctor`, `MMonad` instances.
612* Use `transformers-lift`.
713
14+
8150.2.1.0
916-------
1017
README.md+1−1
@@ -11,7 +11,7 @@ monad transformers and classes in a compatible way.
1111
1212## Installation
1313
14−You can install `ether 0.3.0.0`
14+You can install `ether 0.3.1.0`
1515
16161. using Cabal, from Hackage;
17172. using Stack, from Stackage;
ether.cabal+1−1
@@ -1,5 +1,5 @@
11name: ether
2−version: 0.3.0.0
2+version: 0.3.1.0
33synopsis: Monad transformers and classes
44description:
55 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
3131 -- normal execution.
3232 catch :: proxy tag -> m a -> (e -> m a) -> m a
3333
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
3535 throw = E.throw
3636 catch = E.catch
3737
38−instance ( Lift.LiftCatch t
38+instance {-# OVERLAPPABLE #-}
39+ ( Lift.LiftCatch t
3940 , Monad (t m)
4041 , MonadExcept tag e m
4142 ) => MonadExcept tag e (t m) where
src/Control/Monad/Ether/Reader/Class.hs+3−2
@@ -57,12 +57,13 @@ asks
5757 -> m a
5858asks = reader
5959
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
6161 ask = R.ask
6262 local = R.local
6363 reader = R.reader
6464
65−instance ( Lift.LiftLocal t
65+instance {-# OVERLAPPABLE #-}
66+ ( Lift.LiftLocal t
6667 , Monad (t m)
6768 , MonadReader tag r m
6869 ) => 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
2222import Data.Monoid
2323#endif
2424
25−import Control.Monad.Trans (lift)
25+import Control.Monad.Trans (MonadTrans(..))
2626
27−import Control.Monad.Trans.Ether.Reader (ReaderT)
28−import Control.Monad.Trans.Ether.Writer (WriterT)
29−import Control.Monad.Trans.Ether.Except (ExceptT)
3027import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
3128import qualified Control.Monad.Trans.Ether.State.Strict as S.S
3229import qualified Control.Ether.Util as Util
3330
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−
4631-- | See 'Control.Monad.State.MonadState'.
4732class Monad m => MonadState tag s m | m tag -> s where
4833
@@ -72,91 +57,21 @@ modify t f = state t (\s -> ((), f s))
7257gets :: MonadState tag s m => proxy tag -> (s -> a) -> m a
7358gets t f = Util.fmap f (get t)
7459
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
7661 get = S.L.get
7762 put = S.L.put
7863 state = S.L.state
7964
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
8666 get = S.S.get
8767 put = S.S.put
8868 state = S.S.state
8969
90−instance MonadState tag s m => MonadState tag s (S.S.StateT tag' s' m) where
91− get t = lift (get t)
92− put t = lift . put t
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
115− get t = lift (get t)
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
70+instance {-# OVERLAPPABLE #-}
71+ ( MonadTrans t
72+ , Monad (t m)
73+ , MonadState tag s m
74+ ) => MonadState tag s (t m) where
16075 get t = lift (get t)
16176 put t = lift . put t
16277 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
6363 a <- m
6464 return (a, f)
6565
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
6767 writer = W.writer
6868 tell = W.tell
6969 listen = W.listen
7070 pass = W.pass
7171
72−instance ( Lift.LiftListen t
72+instance {-# OVERLAPPABLE #-}
73+ ( Lift.LiftListen t
7374 , Lift.LiftPass t
7475 , Monad (t m)
7576 , MonadWriter tag w m
stack.yaml+1−1
@@ -2,4 +2,4 @@ flags: {}
22packages:
33- '.'
44extra-deps: []
5−resolver: lts-3.5
5+resolver: lts-3.9
test/Regression.hs+3
@@ -213,3 +213,6 @@ wrapStateBad2 = do
213213
214214wrapStateBad2Core :: Int -> Int
215215wrapStateBad2Core = evalState foo (ensureUniqueTags $ ethered foo wrapStateBad2)
216+
217+wrapReaderCore :: Int -> Int
218+wrapReaderCore = runReader foo (ethered foo ((+) <$> T.ask <*> ask foo))