mmorph 1.1.3 → 1.1.4
raw patch · 3 files changed
+32/−76 lines, 3 filesdep +faildep ~base
Dependencies added: fail
Dependency ranges changed: base
Files
- CHANGELOG.md +4/−0
- mmorph.cabal +6/−2
- src/Control/Monad/Trans/Compose.hs +22/−74
CHANGELOG.md view
@@ -1,3 +1,7 @@+1.1.4++* Fix `MonadFail`-related code to work for GHCJS+ 1.1.3 * Add an `MFunctor` instance for `ComposeT` for GHC >= 8.6
mmorph.cabal view
@@ -1,6 +1,6 @@ Name: mmorph-Version: 1.1.3-Cabal-Version: >= 1.8.0.2+Version: 1.1.4+Cabal-Version: >= 1.10 Build-Type: Simple License: BSD3 License-File: LICENSE@@ -24,5 +24,9 @@ mtl >= 2.1 && < 2.3, transformers >= 0.2.0.0 && < 0.6, transformers-compat >= 0.3 && < 0.7+ if impl(ghc < 8.0)+ Build-Depends:+ fail == 4.9.* Exposed-Modules: Control.Monad.Morph, Control.Monad.Trans.Compose GHC-Options: -O2+ Default-Language: Haskell2010
src/Control/Monad/Trans/Compose.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE UndecidableInstances #-}@@ -35,9 +36,8 @@ import Data.Traversable (Traversable(traverse, sequenceA, mapM, sequence)) import Prelude hiding (foldr, foldl, foldr1, foldl1, mapM, sequence) -#if __GLASGOW_HASKELL__ >= 800+#if !MIN_VERSION_base(4,11,0) import Control.Monad.Fail (MonadFail(..))-import qualified Control.Monad.Fail #endif infixr 9 `ComposeT`@@ -45,7 +45,26 @@ -- | Composition of monad transformers. newtype ComposeT (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) m a = ComposeT { getComposeT :: f (g m) a }- deriving (Eq, Ord, Read, Show)+ deriving+ ( Alternative+ , Applicative+ , Eq+ , Foldable+ , Functor+ , Ord+ , Read+ , Show+ , Monad+ , MonadCont+ , MonadError e+ , MonadFail+ , MonadIO+ , MonadPlus+ , MonadReader r+ , MonadRWS r w s+ , MonadState s+ , MonadWriter w+ ) instance (MFunctor f, MonadTrans f, MonadTrans g) => MonadTrans (ComposeT f g) where@@ -56,77 +75,6 @@ => MFunctor (ComposeT f g) where hoist f (ComposeT m) = ComposeT (hoist (hoist f) m) #endif--instance Functor (f (g m)) => Functor (ComposeT f g m) where- fmap f (ComposeT m) = ComposeT (fmap f m)--instance Applicative (f (g m)) => Applicative (ComposeT f g m) where- pure a = ComposeT (pure a)- ComposeT f <*> ComposeT a = ComposeT (f <*> a)- ComposeT a *> ComposeT b = ComposeT (a *> b)- ComposeT a <* ComposeT b = ComposeT (a <* b)--instance Alternative (f (g m)) => Alternative (ComposeT f g m) where- empty = ComposeT empty- ComposeT a <|> ComposeT b = ComposeT (a <|> b)--instance Monad (f (g m)) => Monad (ComposeT f g m) where- return a = ComposeT (return a)- m >>= f = ComposeT (getComposeT m >>= \x -> getComposeT (f x))-#if __GLASGOW_HASKELL__ < 808- fail e = ComposeT (Prelude.fail e)-#endif--#if __GLASGOW_HASKELL__ >= 800-instance MonadFail (f (g m)) => MonadFail (ComposeT f g m) where- fail e = ComposeT (Control.Monad.Fail.fail e)-#endif--instance MonadPlus (f (g m)) => MonadPlus (ComposeT f g m) where- mzero = ComposeT mzero- ComposeT a `mplus` ComposeT b = ComposeT (a `mplus` b)--instance MonadIO (f (g m)) => MonadIO (ComposeT f g m) where- liftIO m = ComposeT (liftIO m)--instance Foldable (f (g m)) => Foldable (ComposeT f g m) where- fold (ComposeT m) = fold m- foldMap f (ComposeT m) = foldMap f m- foldr f a (ComposeT m) = foldr f a m- foldl f a (ComposeT m) = foldl f a m- foldr1 f (ComposeT m) = foldr1 f m- foldl1 f (ComposeT m) = foldl1 f m--instance Traversable (f (g m)) => Traversable (ComposeT f g m) where- traverse f (ComposeT m) = fmap ComposeT (traverse f m)- sequenceA (ComposeT m) = fmap ComposeT (sequenceA m)- mapM f (ComposeT m) = liftM ComposeT (mapM f m)- sequence (ComposeT m) = liftM ComposeT (sequence m)--instance MonadCont (f (g m)) => MonadCont (ComposeT f g m) where- callCC f = ComposeT $ callCC $ \c -> getComposeT (f (ComposeT . c))--instance MonadError e (f (g m)) => MonadError e (ComposeT f g m) where- throwError = ComposeT . throwError- catchError m h = ComposeT $ catchError (getComposeT m) (getComposeT . h)--instance MonadRWS r w s (f (g m)) => MonadRWS r w s (ComposeT f g m)--instance MonadReader r (f (g m)) => MonadReader r (ComposeT f g m) where- ask = ComposeT ask- local = mapComposeT . local- reader = ComposeT . reader--instance MonadState s (f (g m)) => MonadState s (ComposeT f g m) where- get = ComposeT get- put = ComposeT . put- state = ComposeT . state--instance MonadWriter w (f (g m)) => MonadWriter w (ComposeT f g m) where- writer = ComposeT . writer- tell = ComposeT . tell- listen = mapComposeT listen- pass = mapComposeT pass -- | Transform the computation inside a 'ComposeT'. mapComposeT :: (f (g m) a -> p (q n) b) -> ComposeT f g m a -> ComposeT p q n b