Add `MonadFail` instances
authorhvr <hvr@gnu.org>
Tue, 24 Nov 2015 20:06:03 +0000 (20:06 +0000)
committerhvr <hvr@gnu.org>
Tue, 24 Nov 2015 20:06:03 +0000 (20:06 +0000)
This adds `MonadFail` instances for all `Monad` instances
which explicitly define a `fail` method.

12 files changed:
Control/Monad/Trans/Error.hs
Control/Monad/Trans/Except.hs
Control/Monad/Trans/Identity.hs
Control/Monad/Trans/List.hs
Control/Monad/Trans/Maybe.hs
Control/Monad/Trans/RWS/Lazy.hs
Control/Monad/Trans/RWS/Strict.hs
Control/Monad/Trans/Reader.hs
Control/Monad/Trans/State/Lazy.hs
Control/Monad/Trans/State/Strict.hs
Control/Monad/Trans/Writer/Lazy.hs
Control/Monad/Trans/Writer/Strict.hs

index 5b01586..9830f02 100644 (file)
@@ -62,8 +62,10 @@ import Data.Functor.Classes
 import Control.Applicative
 import Control.Exception (IOException)
 import Control.Monad
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Fix
-
 #if !(MIN_VERSION_base(4,6,0))
 import Control.Monad.Instances ()  -- deprecated from base-4.6
 #endif
@@ -229,6 +231,11 @@ instance (Monad m, Error e) => Monad (ErrorT e m) where
             Right r -> runErrorT (k r)
     fail msg = ErrorT $ return (Left (strMsg msg))
 
+#if MIN_VERSION_base(4,9,0)
+instance (Monad m, Error e) => Fail.MonadFail (ErrorT e m) where
+    fail msg = ErrorT $ return (Left (strMsg msg))
+#endif
+
 instance (Monad m, Error e) => MonadPlus (ErrorT e m) where
     mzero       = ErrorT $ return (Left noMsg)
     m `mplus` n = ErrorT $ do
index 2b68b98..aad3594 100644 (file)
@@ -55,6 +55,9 @@ import Data.Functor.Identity
 
 import Control.Applicative
 import Control.Monad
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Fix
 #if MIN_VERSION_base(4,4,0)
 import Control.Monad.Zip (MonadZip(mzipWith))
@@ -188,6 +191,11 @@ instance (Monad m) => Monad (ExceptT e m) where
             Right x -> runExceptT (k x)
     fail = ExceptT . fail
 
+#if MIN_VERSION_base(4,9,0)
+instance (Fail.MonadFail m) => Fail.MonadFail (ExceptT e m) where
+    fail = ExceptT . Fail.fail
+#endif
+
 instance (Monad m, Monoid e) => MonadPlus (ExceptT e m) where
     mzero = ExceptT $ return (Left mempty)
     ExceptT mx `mplus` ExceptT my = ExceptT $ do
index 238171e..0935945 100644 (file)
@@ -39,6 +39,9 @@ import Data.Functor.Classes
 
 import Control.Applicative
 import Control.Monad (MonadPlus(mzero, mplus))
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Fix (MonadFix(mfix))
 #if MIN_VERSION_base(4,4,0)
 import Control.Monad.Zip (MonadZip(mzipWith))
@@ -92,6 +95,11 @@ instance (Monad m) => Monad (IdentityT m) where
     m >>= k = IdentityT $ runIdentityT . k =<< runIdentityT m
     fail msg = IdentityT $ fail msg
 
+#if MIN_VERSION_base(4,9,0)
+instance (Fail.MonadFail m) => Fail.MonadFail (IdentityT m) where
+    fail msg = IdentityT $ Fail.fail msg
+#endif
+
 instance (MonadPlus m) => MonadPlus (IdentityT m) where
     mzero = IdentityT mzero
     mplus = lift2IdentityT mplus
index 58dc1c2..a76104a 100644 (file)
@@ -36,6 +36,9 @@ import Data.Functor.Classes
 
 import Control.Applicative
 import Control.Monad
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 #if MIN_VERSION_base(4,4,0)
 import Control.Monad.Zip (MonadZip(mzipWith))
 #endif
@@ -99,6 +102,11 @@ instance (Monad m) => Monad (ListT m) where
         return (concat b)
     fail _ = ListT $ return []
 
+#if MIN_VERSION_base(4,9,0)
+instance (Monad m) => Fail.MonadFail (ListT m) where
+    fail _ = ListT $ return []
+#endif
+
 instance (Monad m) => MonadPlus (ListT m) where
     mzero       = ListT $ return []
     m `mplus` n = ListT $ do
index c7e4bfb..7b128ff 100644 (file)
@@ -48,6 +48,9 @@ import Data.Functor.Classes
 
 import Control.Applicative
 import Control.Monad (MonadPlus(mzero, mplus), liftM)
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Fix (MonadFix(mfix))
 #if MIN_VERSION_base(4,4,0)
 import Control.Monad.Zip (MonadZip(mzipWith))
@@ -141,6 +144,11 @@ instance (Monad m) => Monad (MaybeT m) where
             Nothing -> return Nothing
             Just y  -> runMaybeT (f y)
 
+#if MIN_VERSION_base(4,9,0)
+instance (Monad m) => Fail.MonadFail (MaybeT m) where
+    fail _ = MaybeT (return Nothing)
+#endif
+
 instance (Monad m) => MonadPlus (MaybeT m) where
     mzero = MaybeT (return Nothing)
     mplus x y = MaybeT $ do
index 087c950..19b9d8d 100644 (file)
@@ -67,6 +67,9 @@ import Data.Functor.Identity
 
 import Control.Applicative
 import Control.Monad
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Fix
 import Data.Monoid
 
@@ -184,6 +187,11 @@ instance (Monoid w, Monad m) => Monad (RWST r w s m) where
         return (b, s'', w `mappend` w')
     fail msg = RWST $ \ _ _ -> fail msg
 
+#if MIN_VERSION_base(4,9,0)
+instance (Monoid w, Fail.MonadFail m) => Fail.MonadFail (RWST r w s m) where
+    fail msg = RWST $ \ _ _ -> Fail.fail msg
+#endif
+
 instance (Monoid w, MonadPlus m) => MonadPlus (RWST r w s m) where
     mzero = RWST $ \ _ _ -> mzero
     RWST m `mplus` RWST n = RWST $ \ r s -> m r s `mplus` n r s
index b376f26..b9c86ad 100644 (file)
@@ -67,6 +67,9 @@ import Data.Functor.Identity
 
 import Control.Applicative
 import Control.Monad
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Fix
 import Data.Monoid
 
@@ -184,6 +187,11 @@ instance (Monoid w, Monad m) => Monad (RWST r w s m) where
         return (b, s'', w `mappend` w')
     fail msg = RWST $ \ _ _ -> fail msg
 
+#if MIN_VERSION_base(4,9,0)
+instance (Monoid w, Fail.MonadFail m) => Fail.MonadFail (RWST r w s m) where
+    fail msg = RWST $ \ _ _ -> Fail.fail msg
+#endif
+
 instance (Monoid w, MonadPlus m) => MonadPlus (RWST r w s m) where
     mzero = RWST $ \ _ _ -> mzero
     RWST m `mplus` RWST n = RWST $ \ r s -> m r s `mplus` n r s
index f883f3b..a2c797f 100644 (file)
@@ -53,6 +53,9 @@ import Data.Functor.Identity
 
 import Control.Applicative
 import Control.Monad
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Fix
 #if !(MIN_VERSION_base(4,6,0))
 import Control.Monad.Instances ()  -- deprecated from base-4.6
@@ -140,6 +143,11 @@ instance (Monad m) => Monad (ReaderT r m) where
         runReaderT (k a) r
     fail msg = lift (fail msg)
 
+#if MIN_VERSION_base(4,9,0)
+instance (Fail.MonadFail m) => Fail.MonadFail (ReaderT r m) where
+    fail msg = lift (Fail.fail msg)
+#endif
+
 instance (MonadPlus m) => MonadPlus (ReaderT r m) where
     mzero       = lift mzero
     m `mplus` n = ReaderT $ \ r -> runReaderT m r `mplus` runReaderT n r
index 4084988..ab4f8ee 100644 (file)
@@ -80,6 +80,9 @@ import Data.Functor.Identity
 
 import Control.Applicative
 import Control.Monad
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Fix
 
 -- ---------------------------------------------------------------------------
@@ -205,6 +208,11 @@ instance (Monad m) => Monad (StateT s m) where
         runStateT (k a) s'
     fail str = StateT $ \ _ -> fail str
 
+#if MIN_VERSION_base(4,9,0)
+instance (Fail.MonadFail m) => Fail.MonadFail (StateT s m) where
+    fail str = StateT $ \ _ -> Fail.fail str
+#endif
+
 instance (MonadPlus m) => MonadPlus (StateT s m) where
     mzero       = StateT $ \ _ -> mzero
     StateT m `mplus` StateT n = StateT $ \ s -> m s `mplus` n s
index ef42d48..5845ad5 100644 (file)
@@ -77,6 +77,9 @@ import Data.Functor.Identity
 
 import Control.Applicative
 import Control.Monad
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Fix
 
 -- ---------------------------------------------------------------------------
@@ -202,6 +205,11 @@ instance (Monad m) => Monad (StateT s m) where
         runStateT (k a) s'
     fail str = StateT $ \ _ -> fail str
 
+#if MIN_VERSION_base(4,9,0)
+instance (Fail.MonadFail m) => Fail.MonadFail (StateT s m) where
+    fail str = StateT $ \ _ -> Fail.fail str
+#endif
+
 instance (MonadPlus m) => MonadPlus (StateT s m) where
     mzero       = StateT $ \ _ -> mzero
     m `mplus` n = StateT $ \ s -> runStateT m s `mplus` runStateT n s
index 1342e32..41d87cf 100644 (file)
@@ -56,6 +56,9 @@ import Data.Functor.Identity
 
 import Control.Applicative
 import Control.Monad
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Fix
 import Control.Monad.Signatures
 #if MIN_VERSION_base(4,4,0)
@@ -173,6 +176,11 @@ instance (Monoid w, Monad m) => Monad (WriterT w m) where
         return (b, w `mappend` w')
     fail msg = WriterT $ fail msg
 
+#if MIN_VERSION_base(4,9,0)
+instance (Monoid w, Fail.MonadFail m) => Fail.MonadFail (WriterT w m) where
+    fail msg = WriterT $ Fail.fail msg
+#endif
+
 instance (Monoid w, MonadPlus m) => MonadPlus (WriterT w m) where
     mzero       = WriterT mzero
     m `mplus` n = WriterT $ runWriterT m `mplus` runWriterT n
index 4d3a5dd..9d0fbb4 100644 (file)
@@ -59,6 +59,9 @@ import Data.Functor.Identity
 
 import Control.Applicative
 import Control.Monad
+#if MIN_VERSION_base(4,9,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Fix
 import Control.Monad.Signatures
 #if MIN_VERSION_base(4,4,0)
@@ -176,6 +179,11 @@ instance (Monoid w, Monad m) => Monad (WriterT w m) where
         return (b, w `mappend` w')
     fail msg = WriterT $ fail msg
 
+#if MIN_VERSION_base(4,9,0)
+instance (Monoid w, Fail.MonadFail m) => Fail.MonadFail (WriterT w m) where
+    fail msg = WriterT $ Fail.fail msg
+#endif
+
 instance (Monoid w, MonadPlus m) => MonadPlus (WriterT w m) where
     mzero       = WriterT mzero
     m `mplus` n = WriterT $ runWriterT m `mplus` runWriterT n