control-monad-failure 0.1 → 0.2
raw patch · 5 files changed
+199/−77 lines, 5 filesdep −extensible-exceptionsdep −prettydep −template-haskelldep ~basedep ~transformersPVP ok
version bump matches the API change (PVP)
Dependencies removed: extensible-exceptions, pretty, template-haskell
Dependency ranges changed: base, transformers
API changes (from Hackage documentation)
- Control.Monad.Failure: class (Monad m) => MonadFailure e m
- Control.Monad.Failure: failure :: (MonadFailure e m) => e -> m a
- Control.Monad.Failure: instance [overlap ok] (Error e) => MonadFailure e (Either e)
- Control.Monad.Failure: instance [overlap ok] (Error e, Monad m) => MonadFailure e (ErrorT e m)
- Control.Monad.Failure: instance [overlap ok] (Exception e) => MonadFailure e IO
- Control.Monad.Failure: instance [overlap ok] (MonadFailure e m) => MonadFailure e (ListT m)
- Control.Monad.Failure: instance [overlap ok] (MonadFailure e m) => MonadFailure e (ReaderT r m)
- Control.Monad.Failure: instance [overlap ok] (MonadFailure e m) => MonadFailure e (StateT s m)
- Control.Monad.Failure: instance [overlap ok] (Monoid w, MonadFailure e m) => MonadFailure e (RWST r w s m)
- Control.Monad.Failure: instance [overlap ok] (Monoid w, MonadFailure e m) => MonadFailure e (WriterT w m)
- Control.Monad.Failure: instance [overlap ok] MonadFailure e Maybe
- Control.Monad.Failure: instance [overlap ok] MonadFailure e []
+ Control.Monad.Failure.Class: class (Monad m) => MonadFailure e m
+ Control.Monad.Failure.Class: class (MonadFailure e m) => WrapFailure e m
+ Control.Monad.Failure.Class: failure :: (MonadFailure e m) => e -> m a
+ Control.Monad.Failure.Class: instance (Exception e) => MonadFailure e IO
+ Control.Monad.Failure.Class: instance MonadFailure e Maybe
+ Control.Monad.Failure.Class: instance MonadFailure e []
+ Control.Monad.Failure.Class: wrapFailure :: (WrapFailure e m) => (forall eIn. (Exception eIn) => eIn -> e) -> m a -> m a
+ Control.Monad.Failure.Mtl: instance (Error e, Monad m) => MonadFailure e (ErrorT e m)
+ Control.Monad.Failure.Mtl: instance (MonadFailure e m) => MonadFailure e (ListT m)
+ Control.Monad.Failure.Mtl: instance (MonadFailure e m) => MonadFailure e (ReaderT r m)
+ Control.Monad.Failure.Mtl: instance (MonadFailure e m) => MonadFailure e (StateT s m)
+ Control.Monad.Failure.Mtl: instance (Monoid w, MonadFailure e m) => MonadFailure e (RWST r w s m)
+ Control.Monad.Failure.Mtl: instance (Monoid w, MonadFailure e m) => MonadFailure e (WriterT w m)
+ Control.Monad.Failure.Mtl: instance (WrapFailure e m) => WrapFailure e (ListT m)
+ Control.Monad.Failure.Mtl: instance (WrapFailure e m) => WrapFailure e (ReaderT r m)
+ Control.Monad.Failure.Mtl: instance (WrapFailure e m) => WrapFailure e (StateT s m)
+ Control.Monad.Failure.Mtl: instance (WrapFailure e m, Monoid w) => WrapFailure e (RWST r w s m)
+ Control.Monad.Failure.Mtl: instance (WrapFailure e m, Monoid w) => WrapFailure e (WriterT w m)
+ Control.Monad.Failure.Transformers: instance (Error e) => MonadFailure e (Either e)
+ Control.Monad.Failure.Transformers: instance (Error e, Monad m) => MonadFailure e (ErrorT e m)
+ Control.Monad.Failure.Transformers: instance (Exception e) => WrapFailure e IO
+ Control.Monad.Failure.Transformers: instance (MonadFailure e m) => MonadFailure e (ListT m)
+ Control.Monad.Failure.Transformers: instance (MonadFailure e m) => MonadFailure e (ReaderT r m)
+ Control.Monad.Failure.Transformers: instance (MonadFailure e m) => MonadFailure e (StateT s m)
+ Control.Monad.Failure.Transformers: instance (Monoid w, MonadFailure e m) => MonadFailure e (RWST r w s m)
+ Control.Monad.Failure.Transformers: instance (Monoid w, MonadFailure e m) => MonadFailure e (WriterT w m)
+ Control.Monad.Failure.Transformers: instance (WrapFailure e m) => WrapFailure e (ListT m)
+ Control.Monad.Failure.Transformers: instance (WrapFailure e m) => WrapFailure e (ReaderT r m)
+ Control.Monad.Failure.Transformers: instance (WrapFailure e m) => WrapFailure e (StateT s m)
+ Control.Monad.Failure.Transformers: instance (WrapFailure e m, Monoid w) => WrapFailure e (RWST r w s m)
+ Control.Monad.Failure.Transformers: instance (WrapFailure e m, Monoid w) => WrapFailure e (WriterT w m)
Files
- Control/Monad/Failure.hs +2/−61
- Control/Monad/Failure/Class.hs +26/−0
- Control/Monad/Failure/Mtl.hs +76/−0
- Control/Monad/Failure/Transformers.hs +85/−0
- control-monad-failure.cabal +10/−16
Control/Monad/Failure.hs view
@@ -1,62 +1,3 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE OverlappingInstances #-}--{-| Defines the class @MonadFailure@ for monads which can fail.--}-module Control.Monad.Failure where--import Control.Exception (throw, Exception)-import Control.Monad-#if TRANSFORMERS-import Control.Monad.Trans-import Control.Monad.Trans.Error-import Control.Monad.Trans.List-import Control.Monad.Trans.Reader-import Control.Monad.Trans.State-import Control.Monad.Trans.Writer-import Control.Monad.Trans.RWS-#else-import Control.Monad.Error-import Control.Monad.List-import Control.Monad.Reader-import Control.Monad.State-import Control.Monad.Writer-import Control.Monad.RWS-#endif--import Data.Monoid--class Monad m => MonadFailure e m where- failure :: e -> m a---- ------------- Instances--- -----------instance MonadFailure e Maybe where failure _ = Nothing-instance MonadFailure e [] where failure _ = []--instance Exception e => MonadFailure e IO where- failure = Control.Exception.throw--instance (Error e) => MonadFailure e (Either e) where- failure = Left--instance (Error e, Monad m) => MonadFailure e (ErrorT e m) where- failure = throwError--instance MonadFailure e m => MonadFailure e (ListT m) where- failure = lift . failure--instance MonadFailure e m => MonadFailure e (ReaderT r m) where- failure = lift . failure--instance (Monoid w, MonadFailure e m) => MonadFailure e (WriterT w m) where- failure = lift . failure--instance MonadFailure e m => MonadFailure e (StateT s m) where- failure = lift . failure+module Control.Monad.Failure (module Control.Monad.Failure.Class) where -instance (Monoid w, MonadFailure e m) => MonadFailure e (RWST r w s m) where- failure = lift . failure+import Control.Monad.Failure.Class
+ Control/Monad/Failure/Class.hs view
@@ -0,0 +1,26 @@+{-# LANGUAGE Rank2Types #-}+{-| Defines the class @MonadFailure@ for monads which can fail.+-}+module Control.Monad.Failure.Class where++import Control.Exception (throw, Exception)++class Monad m => MonadFailure e m where+ failure :: e -> m a++class MonadFailure e m => WrapFailure e m where+ -- | Wrap the failure value, if any, with the given function. This is+ -- useful in particular when you want all the exceptions returned from a+ -- certain library to be of a certain type, even if they were generated by+ -- a different library.+ wrapFailure :: (forall eIn. Exception eIn => eIn -> e) -> m a -> m a++-- --------------+-- base instances+-- --------------++instance MonadFailure e Maybe where failure _ = Nothing+instance MonadFailure e [] where failure _ = []++instance Exception e => MonadFailure e IO where+ failure = Control.Exception.throw
+ Control/Monad/Failure/Mtl.hs view
@@ -0,0 +1,76 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE FlexibleInstances #-}++module Control.Monad.Failure.Mtl (module Control.Monad.Failure.Class) where++import Control.Monad.Failure.Class++import Control.Monad.Error+import Control.Monad.List+import Control.Monad.Reader+import Control.Monad.State.Lazy as Lazy+import Control.Monad.State.Strict as Strict+import Control.Monad.Writer.Lazy as Lazy+import Control.Monad.Writer.Strict as Strict+import Control.Monad.RWS.Lazy as Lazy+import Control.Monad.RWS.Strict as Strict+import Data.Monoid++-- -----------------------+-- MonadFailure Instances+-- -----------------------++instance (Error e, Monad m) => MonadFailure e (ErrorT e m) where+ failure = throwError++instance MonadFailure e m => MonadFailure e (ListT m) where+ failure = lift . failure++instance MonadFailure e m => MonadFailure e (ReaderT r m) where+ failure = lift . failure++instance (Monoid w, MonadFailure e m) => MonadFailure e (Lazy.WriterT w m) where+ failure = lift . failure++instance MonadFailure e m => MonadFailure e (Lazy.StateT s m) where+ failure = lift . failure++instance (Monoid w, MonadFailure e m) => MonadFailure e (Lazy.RWST r w s m) where+ failure = lift . failure++instance (Monoid w, MonadFailure e m) => MonadFailure e (Strict.WriterT w m) where+ failure = lift . failure++instance MonadFailure e m => MonadFailure e (Strict.StateT s m) where+ failure = lift . failure++instance (Monoid w, MonadFailure e m) => MonadFailure e (Strict.RWST r w s m) where+ failure = lift . failure++-- ---------------------+-- WrapFailure instances+-- ---------------------++instance WrapFailure e m => WrapFailure e (ListT m) where+ wrapFailure f = ListT . wrapFailure f . runListT++instance WrapFailure e m => WrapFailure e (ReaderT r m) where+ wrapFailure f m = ReaderT $ \r -> wrapFailure f (runReaderT m r)++instance (WrapFailure e m, Monoid w) => WrapFailure e (Lazy.WriterT w m) where+ wrapFailure f = Lazy.WriterT . wrapFailure f . Lazy.runWriterT+++-- all the following instances require undecidable instances+instance WrapFailure e m => WrapFailure e (Lazy.StateT s m) where+ wrapFailure f m = Lazy.StateT $ \s -> wrapFailure f (Lazy.runStateT m s)++instance (WrapFailure e m, Monoid w) => WrapFailure e (Lazy.RWST r w s m) where+ wrapFailure f m = Lazy.RWST $ \r s -> wrapFailure f (Lazy.runRWST m r s)++instance WrapFailure e m => WrapFailure e (Strict.StateT s m) where+ wrapFailure f m = Strict.StateT $ \s -> wrapFailure f (Strict.runStateT m s)++instance (WrapFailure e m, Monoid w) => WrapFailure e (Strict.RWST r w s m) where+ wrapFailure f m = Strict.RWST $ \r s -> wrapFailure f (Strict.runRWST m r s)
+ Control/Monad/Failure/Transformers.hs view
@@ -0,0 +1,85 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE PackageImports #-}++module Control.Monad.Failure.Transformers (module Control.Monad.Failure.Class) where++import Control.Monad.Failure.Class++import Control.Exception (throw, catch, Exception, SomeException(..))+import "transformers" Control.Monad.Trans+import Control.Monad.Trans.Error+import Control.Monad.Trans.List+import Control.Monad.Trans.Reader+import Control.Monad.Trans.State.Lazy as Lazy+import Control.Monad.Trans.State.Strict as Strict+import Control.Monad.Trans.Writer.Lazy as Lazy+import Control.Monad.Trans.Writer.Strict as Strict+import Control.Monad.Trans.RWS.Lazy as Lazy+import Control.Monad.Trans.RWS.Strict as Strict+import Data.Monoid++-- -----------------------+-- MonadFailure Instances+-- -----------------------++instance (Error e) => MonadFailure e (Either e) where+ failure = Left++instance (Error e, Monad m) => MonadFailure e (ErrorT e m) where+ failure = throwError++instance MonadFailure e m => MonadFailure e (ListT m) where+ failure = lift . failure++instance MonadFailure e m => MonadFailure e (ReaderT r m) where+ failure = lift . failure++instance (Monoid w, MonadFailure e m) => MonadFailure e (Lazy.WriterT w m) where+ failure = lift . failure++instance MonadFailure e m => MonadFailure e (Lazy.StateT s m) where+ failure = lift . failure++instance (Monoid w, MonadFailure e m) => MonadFailure e (Lazy.RWST r w s m) where+ failure = lift . failure++instance (Monoid w, MonadFailure e m) => MonadFailure e (Strict.WriterT w m) where+ failure = lift . failure++instance MonadFailure e m => MonadFailure e (Strict.StateT s m) where+ failure = lift . failure++instance (Monoid w, MonadFailure e m) => MonadFailure e (Strict.RWST r w s m) where+ failure = lift . failure++-- ---------------------+-- WrapFailure instances+-- ---------------------++instance Exception e => WrapFailure e IO where+ wrapFailure f m = m `Control.Exception.catch` \e@SomeException{} -> Control.Exception.throw (f e)++instance WrapFailure e m => WrapFailure e (ListT m) where+ wrapFailure f = ListT . wrapFailure f . runListT++instance WrapFailure e m => WrapFailure e (ReaderT r m) where+ wrapFailure f m = ReaderT $ \r -> wrapFailure f (runReaderT m r)++instance (WrapFailure e m, Monoid w) => WrapFailure e (Lazy.WriterT w m) where+ wrapFailure f = Lazy.WriterT . wrapFailure f . Lazy.runWriterT+++-- all the following instances require undecidable instances+instance WrapFailure e m => WrapFailure e (Lazy.StateT s m) where+ wrapFailure f m = Lazy.StateT $ \s -> wrapFailure f (Lazy.runStateT m s)++instance (WrapFailure e m, Monoid w) => WrapFailure e (Lazy.RWST r w s m) where+ wrapFailure f m = Lazy.RWST $ \r s -> wrapFailure f (Lazy.runRWST m r s)++instance WrapFailure e m => WrapFailure e (Strict.StateT s m) where+ wrapFailure f m = Strict.StateT $ \s -> wrapFailure f (Strict.runStateT m s)++instance (WrapFailure e m, Monoid w) => WrapFailure e (Strict.RWST r w s m) where+ wrapFailure f m = Strict.RWST $ \r s -> wrapFailure f (Strict.runRWST m r s)
control-monad-failure.cabal view
@@ -1,5 +1,5 @@ name: control-monad-failure-version: 0.1+version: 0.2 Cabal-Version: >= 1.2.3 build-type: Simple license: PublicDomain@@ -11,25 +11,19 @@ category: Control, Monads stability: experimental -Flag transformers- default: False--Flag extensibleExceptionsInBase+Flag mtl+ default: True Library buildable: True- build-depends: pretty, template-haskell-- if flag(transformers)- build-depends: transformers- cpp-options: -DTRANSFORMERS- else- build-depends: mtl- if flag(extensibleExceptionsInBase)- build-depends: base >= 4 && < 5- else- build-depends: base >= 3 && < 4, extensible-exceptions+ build-depends: base >= 4 && < 5, transformers extensions: MultiParamTypeClasses, FlexibleInstances exposed-modules: Control.Monad.Failure+ Control.Monad.Failure.Class+ Control.Monad.Failure.Transformers+ if flag(mtl)+ cpp-options: -DMTL+ build-depends: mtl+ exposed-modules: Control.Monad.Failure.Mtl