on master help sign in
Merge pull request #1 from neongreen/master
afc2416Index Int
.travis.yml+1
@@ -1,4 +1,5 @@
1env:
1env:
2+ - CABALVER=1.18 GHCVER=7.8.4
2 - CABALVER=1.22 GHCVER=7.10.2
3 - CABALVER=1.22 GHCVER=7.10.2
3 - CABALVER=head GHCVER=head
4 - CABALVER=head GHCVER=head
4
5
CHANGELOG.md+1
@@ -3,3 +3,4 @@
3
3
4* Fix `transformers` lower bound.
4* Fix `transformers` lower bound.
5* Remove unused language extensions.
5* Remove unused language extensions.
6+* GHC 7.8 compatibility.
ether.cabal+5−4
@@ -13,7 +13,7 @@ maintainer: Index Int <vlad.z.4096@gmail.com>
13homepage: https://int-index.github.io/ether/
13homepage: https://int-index.github.io/ether/
14bug-reports: https://github.com/int-index/ether/issues
14bug-reports: https://github.com/int-index/ether/issues
15build-type: Simple
15build-type: Simple
16−cabal-version: >=1.22
16+cabal-version: >=1.18
17extra-source-files: CHANGELOG.md
17extra-source-files: CHANGELOG.md
18
18
19source-repository head
19source-repository head
@@ -53,10 +53,10 @@ library
53
53
54 other-modules: Control.Ether.Util
54 other-modules: Control.Ether.Util
55
55
56− build-depends: base >=4.8 && <4.9
56+ build-depends: base >=4.7 && <4.9
57 , transformers >=0.4.2
57 , transformers >=0.4.2
58 , mtl >=2.2.1
58 , mtl >=2.2.1
59− , template-haskell >=2.10
59+ , template-haskell >=2.9
60 , newtype-generics >=0.4.1
60 , newtype-generics >=0.4.1
61
61
62 default-language: Haskell2010
62 default-language: Haskell2010
@@ -74,6 +74,7 @@ library
74 PolyKinds
74 PolyKinds
75 TypeOperators
75 TypeOperators
76 DefaultSignatures
76 DefaultSignatures
77+ CPP
77
78
78 hs-source-dirs: src
79 hs-source-dirs: src
79 ghc-options: -Wall
80 ghc-options: -Wall
@@ -81,7 +82,7 @@ library
81
82
82test-suite regression
83test-suite regression
83
84
84− build-depends: base >=4.8 && <4.9
85+ build-depends: base >=4.7 && <4.9
85 , transformers >=0.4.2
86 , transformers >=0.4.2
86 , mtl >=2.2.1
87 , mtl >=2.2.1
87 , tasty >=0.10
88 , tasty >=0.10
src/Control/Ether/Util.hs+19
@@ -1,3 +1,4 @@
1+{-# LANGUAGE CPP #-}
1{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE PolyKinds #-}
3{-# LANGUAGE PolyKinds #-}
3{-# LANGUAGE TypeOperators #-}
4{-# LANGUAGE TypeOperators #-}
@@ -8,11 +9,19 @@ module Control.Ether.Util
8 , liftPass_WriterT
9 , liftPass_WriterT
9 , type (++)
10 , type (++)
10 , MaybeToList
11 , MaybeToList
12+ , fmap
11 ) where
13 ) where
12
14
13import qualified Control.Monad.Signatures as Sig
15import qualified Control.Monad.Signatures as Sig
14import qualified Control.Monad.Trans.Except as Trans
16import qualified Control.Monad.Trans.Except as Trans
15import qualified Control.Monad.Trans.Writer as Trans
17import qualified Control.Monad.Trans.Writer as Trans
18+import Prelude hiding (fmap)
19+
20+#if __GLASGOW_HASKELL__ < 710
21+import qualified Control.Monad
22+#else
23+import qualified Prelude
24+#endif
16
25
17type family (as :: [*]) ++ (bs :: [*]) :: [*] where
26type family (as :: [*]) ++ (bs :: [*]) :: [*] where
18 '[] ++ bs = bs
27 '[] ++ bs = bs
@@ -36,3 +45,13 @@ liftPass_WriterT :: Monad m => Sig.Pass w' m (a, w) -> Sig.Pass w' (Trans.Writer
36liftPass_WriterT pass m = Trans.WriterT $ pass $ do
45liftPass_WriterT pass m = Trans.WriterT $ pass $ do
37 ~((a, f), w) <- Trans.runWriterT m
46 ~((a, f), w) <- Trans.runWriterT m
38 return ((a, w), f)
47 return ((a, w), f)
48+
49+#if __GLASGOW_HASKELL__ < 710
50+fmap :: Monad f => (a -> b) -> f a -> f b
51+fmap = Control.Monad.liftM
52+#else
53+fmap :: Functor f => (a -> b) -> f a -> f b
54+fmap = Prelude.fmap
55+#endif
56+
57+{-# INLINE fmap #-}
src/Control/Ether/Wrapped.hs+1−1
@@ -27,7 +27,7 @@ module Control.Ether.Wrapped
27 ) where
27 ) where
28
28
29import Data.Proxy (Proxy(Proxy))
29import Data.Proxy (Proxy(Proxy))
30−import Control.Applicative (Alternative)
30+import Control.Applicative
31import Control.Monad (MonadPlus)
31import Control.Monad (MonadPlus)
32import Control.Monad.Fix (MonadFix)
32import Control.Monad.Fix (MonadFix)
33import Control.Monad.IO.Class (MonadIO)
33import Control.Monad.IO.Class (MonadIO)
src/Control/Monad/Ether/Except/Class.hs+11
@@ -1,14 +1,25 @@
1+{-# OPTIONS_GHC -fno-warn-unrecognised-pragmas #-}
2+
3+{-# LANGUAGE CPP #-}
1{-# LANGUAGE MultiParamTypeClasses #-}
4{-# LANGUAGE MultiParamTypeClasses #-}
2{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE UndecidableInstances #-}
6{-# LANGUAGE UndecidableInstances #-}
4{-# LANGUAGE FunctionalDependencies #-}
7{-# LANGUAGE FunctionalDependencies #-}
5
8
9+#if __GLASGOW_HASKELL__ < 710
10+{-# LANGUAGE OverlappingInstances #-}
11+#endif
12+
6-- | See "Control.Monad.Except".
13-- | See "Control.Monad.Except".
7
14
8module Control.Monad.Ether.Except.Class
15module Control.Monad.Ether.Except.Class
9 ( MonadExcept(..)
16 ( MonadExcept(..)
10 ) where
17 ) where
11
18
19+#if __GLASGOW_HASKELL__ < 710
20+import Data.Monoid
21+#endif
22+
12import Data.Proxy (Proxy(Proxy))
23import Data.Proxy (Proxy(Proxy))
13import Control.Monad.Trans (lift)
24import Control.Monad.Trans (lift)
14
25
src/Control/Monad/Ether/Implicit/Except/TH.hs+1−1
@@ -10,7 +10,7 @@ import Control.Monad.Ether.Implicit.Except
10
10
11-- | Basic building block for 'try'. Runs an 'ExceptT' with a handler.
11-- | Basic building block for 'try'. Runs an 'ExceptT' with a handler.
12try' :: Functor m => ExceptT e m a -> (e -> a) -> m a
12try' :: Functor m => ExceptT e m a -> (e -> a) -> m a
13−try' m h = either h id <$> runExceptT m
13+try' m h = fmap (either h id) (runExceptT m)
14
14
15-- | Handle @n@ exceptions with supplied handlers.
15-- | Handle @n@ exceptions with supplied handlers.
16--
16--
src/Control/Monad/Ether/Reader/Class.hs+13−1
@@ -1,8 +1,15 @@
1+{-# OPTIONS_GHC -fno-warn-unrecognised-pragmas #-}
2+
3+{-# LANGUAGE CPP #-}
1{-# LANGUAGE MultiParamTypeClasses #-}
4{-# LANGUAGE MultiParamTypeClasses #-}
2{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE UndecidableInstances #-}
6{-# LANGUAGE UndecidableInstances #-}
4{-# LANGUAGE FunctionalDependencies #-}
7{-# LANGUAGE FunctionalDependencies #-}
5
8
9+#if __GLASGOW_HASKELL__ < 710
10+{-# LANGUAGE OverlappingInstances #-}
11+#endif
12+
6-- | See "Control.Monad.Reader.Class".
13-- | See "Control.Monad.Reader.Class".
7
14
8module Control.Monad.Ether.Reader.Class
15module Control.Monad.Ether.Reader.Class
@@ -10,6 +17,10 @@ module Control.Monad.Ether.Reader.Class
10 , asks
17 , asks
11 ) where
18 ) where
12
19
20+#if __GLASGOW_HASKELL__ < 710
21+import Data.Monoid
22+#endif
23+
13import Data.Proxy (Proxy(Proxy))
24import Data.Proxy (Proxy(Proxy))
14import Control.Monad.Trans (lift)
25import Control.Monad.Trans (lift)
15
26
@@ -19,6 +30,7 @@ import Control.Monad.Trans.Ether.Reader hiding (reader, ask, local)
19import qualified Control.Monad.Trans.Ether.Reader as R
30import qualified Control.Monad.Trans.Ether.Reader as R
20import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
31import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
21import qualified Control.Monad.Trans.Ether.State.Strict as S.S
32import qualified Control.Monad.Trans.Ether.State.Strict as S.S
33+import qualified Control.Ether.Util as Util
22
34
23-- for mtl instances
35-- for mtl instances
24import qualified Control.Monad.Trans.Cont as Trans (ContT , liftLocal)
36import qualified Control.Monad.Trans.Cont as Trans (ContT , liftLocal)
@@ -56,7 +68,7 @@ class Monad m => MonadReader tag r m | m tag -> r where
56 -> (r -> a)
68 -> (r -> a)
57 -- ^ The selector function to apply to the environment.
69 -- ^ The selector function to apply to the environment.
58 -> m a
70 -> m a
59− reader t f = fmap f (ask t)
71+ reader t f = Util.fmap f (ask t)
60
72
61-- | Retrieves a function of the current environment.
73-- | Retrieves a function of the current environment.
62asks
74asks
src/Control/Monad/Ether/State/Class.hs+13−1
@@ -1,8 +1,15 @@
1+{-# OPTIONS_GHC -fno-warn-unrecognised-pragmas #-}
2+
3+{-# LANGUAGE CPP #-}
1{-# LANGUAGE MultiParamTypeClasses #-}
4{-# LANGUAGE MultiParamTypeClasses #-}
2{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE UndecidableInstances #-}
6{-# LANGUAGE UndecidableInstances #-}
4{-# LANGUAGE FunctionalDependencies #-}
7{-# LANGUAGE FunctionalDependencies #-}
5
8
9+#if __GLASGOW_HASKELL__ < 710
10+{-# LANGUAGE OverlappingInstances #-}
11+#endif
12+
6-- | See "Control.Monad.State.Class".
13-- | See "Control.Monad.State.Class".
7
14
8module Control.Monad.Ether.State.Class
15module Control.Monad.Ether.State.Class
@@ -11,6 +18,10 @@ module Control.Monad.Ether.State.Class
11 , gets
18 , gets
12 ) where
19 ) where
13
20
21+#if __GLASGOW_HASKELL__ < 710
22+import Data.Monoid
23+#endif
24+
14import Control.Monad.Trans (lift)
25import Control.Monad.Trans (lift)
15
26
16import Control.Monad.Trans.Ether.Reader (ReaderT)
27import Control.Monad.Trans.Ether.Reader (ReaderT)
@@ -18,6 +29,7 @@ import Control.Monad.Trans.Ether.Writer (WriterT)
18import Control.Monad.Trans.Ether.Except (ExceptT)
29import Control.Monad.Trans.Ether.Except (ExceptT)
19import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
30import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
20import qualified Control.Monad.Trans.Ether.State.Strict as S.S
31import qualified Control.Monad.Trans.Ether.State.Strict as S.S
32+import qualified Control.Ether.Util as Util
21
33
22-- for mtl instances
34-- for mtl instances
23import qualified Control.Monad.Trans.Cont as Trans (ContT)
35import qualified Control.Monad.Trans.Cont as Trans (ContT)
@@ -58,7 +70,7 @@ modify t f = state t (\s -> ((), f s))
58
70
59-- | Gets specific component of the state, using a projection function supplied.
71-- | Gets specific component of the state, using a projection function supplied.
60gets :: MonadState tag s m => proxy tag -> (s -> a) -> m a
72gets :: MonadState tag s m => proxy tag -> (s -> a) -> m a
61−gets t f = fmap f (get t)
73+gets t f = Util.fmap f (get t)
62
74
63instance {-# OVERLAPPING #-} Monad m => MonadState tag s (S.L.StateT tag s m) where
75instance {-# OVERLAPPING #-} Monad m => MonadState tag s (S.L.StateT tag s m) where
64 get = S.L.get
76 get = S.L.get
src/Control/Monad/Ether/Writer/Class.hs+11
@@ -1,8 +1,15 @@
1+{-# OPTIONS_GHC -fno-warn-unrecognised-pragmas #-}
2+
3+{-# LANGUAGE CPP #-}
1{-# LANGUAGE MultiParamTypeClasses #-}
4{-# LANGUAGE MultiParamTypeClasses #-}
2{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE UndecidableInstances #-}
6{-# LANGUAGE UndecidableInstances #-}
4{-# LANGUAGE FunctionalDependencies #-}
7{-# LANGUAGE FunctionalDependencies #-}
5
8
9+#if __GLASGOW_HASKELL__ < 710
10+{-# LANGUAGE OverlappingInstances #-}
11+#endif
12+
6-- | See "Control.Monad.Writer.Class".
13-- | See "Control.Monad.Writer.Class".
7
14
8module Control.Monad.Ether.Writer.Class
15module Control.Monad.Ether.Writer.Class
@@ -11,6 +18,10 @@ module Control.Monad.Ether.Writer.Class
11 , censor
18 , censor
12 ) where
19 ) where
13
20
21+#if __GLASGOW_HASKELL__ < 710
22+import Data.Monoid
23+#endif
24+
14import Data.Proxy (Proxy(Proxy))
25import Data.Proxy (Proxy(Proxy))
15import Control.Monad.Trans (lift)
26import Control.Monad.Trans (lift)
16
27
src/Control/Monad/Trans/Ether/Except.hs+1−1
@@ -32,7 +32,7 @@ module Control.Monad.Trans.Ether.Except
32import Data.Proxy (Proxy(Proxy))
32import Data.Proxy (Proxy(Proxy))
33import Data.Functor.Identity (Identity(..))
33import Data.Functor.Identity (Identity(..))
34import Data.Coerce (coerce)
34import Data.Coerce (coerce)
35−import Control.Applicative (Alternative)
35+import Control.Applicative
36import Control.Monad (MonadPlus)
36import Control.Monad (MonadPlus)
37import Control.Monad.Fix (MonadFix)
37import Control.Monad.Fix (MonadFix)
38import Control.Monad.Trans.Class (MonadTrans, lift)
38import Control.Monad.Trans.Class (MonadTrans, lift)
src/Control/Monad/Trans/Ether/Reader.hs+1−1
@@ -31,7 +31,7 @@ module Control.Monad.Trans.Ether.Reader
31import Data.Proxy (Proxy(Proxy))
31import Data.Proxy (Proxy(Proxy))
32import Data.Functor.Identity (Identity(..))
32import Data.Functor.Identity (Identity(..))
33import Data.Coerce (coerce)
33import Data.Coerce (coerce)
34−import Control.Applicative (Alternative)
34+import Control.Applicative
35import Control.Monad (MonadPlus)
35import Control.Monad (MonadPlus)
36import Control.Monad.Fix (MonadFix)
36import Control.Monad.Fix (MonadFix)
37import Control.Monad.Trans.Class (MonadTrans, lift)
37import Control.Monad.Trans.Class (MonadTrans, lift)
src/Control/Monad/Trans/Ether/State/Lazy.hs+1−1
@@ -36,7 +36,7 @@ module Control.Monad.Trans.Ether.State.Lazy
36import Data.Proxy (Proxy(Proxy))
36import Data.Proxy (Proxy(Proxy))
37import Data.Functor.Identity (Identity(..))
37import Data.Functor.Identity (Identity(..))
38import Data.Coerce (coerce)
38import Data.Coerce (coerce)
39−import Control.Applicative (Alternative)
39+import Control.Applicative
40import Control.Monad (MonadPlus)
40import Control.Monad (MonadPlus)
41import Control.Monad.Fix (MonadFix)
41import Control.Monad.Fix (MonadFix)
42import Control.Monad.Trans.Class (MonadTrans, lift)
42import Control.Monad.Trans.Class (MonadTrans, lift)
src/Control/Monad/Trans/Ether/State/Strict.hs+1−1
@@ -36,7 +36,7 @@ module Control.Monad.Trans.Ether.State.Strict
36import Data.Proxy (Proxy(Proxy))
36import Data.Proxy (Proxy(Proxy))
37import Data.Functor.Identity (Identity(..))
37import Data.Functor.Identity (Identity(..))
38import Data.Coerce (coerce)
38import Data.Coerce (coerce)
39−import Control.Applicative (Alternative)
39+import Control.Applicative
40import Control.Monad (MonadPlus)
40import Control.Monad (MonadPlus)
41import Control.Monad.Fix (MonadFix)
41import Control.Monad.Fix (MonadFix)
42import Control.Monad.Trans.Class (MonadTrans, lift)
42import Control.Monad.Trans.Class (MonadTrans, lift)
src/Control/Monad/Trans/Ether/Writer.hs+6−1
@@ -1,3 +1,4 @@
1+{-# LANGUAGE CPP #-}
1{-# LANGUAGE DeriveGeneric #-}
2{-# LANGUAGE DeriveGeneric #-}
2{-# LANGUAGE MultiParamTypeClasses #-}
3{-# LANGUAGE MultiParamTypeClasses #-}
3{-# LANGUAGE TypeFamilies #-}
4{-# LANGUAGE TypeFamilies #-}
@@ -32,10 +33,14 @@ module Control.Monad.Trans.Ether.Writer
32 , liftPass
33 , liftPass
33 ) where
34 ) where
34
35
36+#if __GLASGOW_HASKELL__ < 710
37+import Data.Monoid
38+#endif
39+
35import Data.Proxy (Proxy(Proxy))
40import Data.Proxy (Proxy(Proxy))
36import Data.Functor.Identity (Identity(..))
41import Data.Functor.Identity (Identity(..))
37import Data.Coerce (coerce)
42import Data.Coerce (coerce)
38−import Control.Applicative (Alternative)
43+import Control.Applicative
39import Control.Monad (MonadPlus)
44import Control.Monad (MonadPlus)
40import Control.Monad.Fix (MonadFix)
45import Control.Monad.Fix (MonadFix)
41import Control.Monad.Trans.Class (MonadTrans, lift)
46import Control.Monad.Trans.Class (MonadTrans, lift)
test/Regression.hs+5−5
@@ -9,7 +9,7 @@ module Main where
9
9
10import Data.Functor.Identity
10import Data.Functor.Identity
11import Data.Monoid
11import Data.Monoid
12−import Data.Foldable
12+import Control.Monad
13import Control.Ether.Tagged
13import Control.Ether.Tagged
14import Control.Ether.TH
14import Control.Ether.TH
15import Control.Ether.Wrapped
15import Control.Ether.Wrapped
@@ -182,7 +182,7 @@ try3 = $(try 3)
182exceptCore' :: Double -> Double -> String
182exceptCore' :: Double -> Double -> String
183exceptCore' a b = runIdentity $ do
183exceptCore' a b = runIdentity $ do
184 $(try 2)
184 $(try 2)
185− (show <$> exceptCore a b)
185+ (liftM show (exceptCore a b))
186 (\(NegativeLog (x::Double)) -> "nl: " ++ show x)
186 (\(NegativeLog (x::Double)) -> "nl: " ++ show x)
187 (\DivideByZero -> "dz")
187 (\DivideByZero -> "dz")
188
188
@@ -192,7 +192,7 @@ summatorCore
192 , MonadWriter Foo (Sum a) m
192 , MonadWriter Foo (Sum a) m
193 ) => [a] -> m ()
193 ) => [a] -> m ()
194summatorCore xs = do
194summatorCore xs = do
195− for_ xs $ \x -> do
195+ forM_ xs $ \x -> do
196 T.tell (Sum x)
196 T.tell (Sum x)
197 tell foo (Sum 1)
197 tell foo (Sum 1)
198
198
@@ -200,10 +200,10 @@ summatorCore' :: Num a => [a] -> (Sum a, Sum a)
200summatorCore' = runWriter foo . T.execWriterT . summatorCore
200summatorCore' = runWriter foo . T.execWriterT . summatorCore
201
201
202wrapState_f :: T.MonadState Int m => m String
202wrapState_f :: T.MonadState Int m => m String
203−wrapState_f = fmap show T.get
203+wrapState_f = liftM show T.get
204
204
205wrapState_g :: T.MonadState Bool m => m String
205wrapState_g :: T.MonadState Bool m => m String
206−wrapState_g = fmap show T.get
206+wrapState_g = liftM show T.get
207
207
208wrapState_useboth
208wrapState_useboth
209 :: ( MonadState Foo Int m
209 :: ( MonadState Foo Int m