summaryrefslogtreecommitdiff
blob: 3da6f26e0dd4b8dcdb64d1f561d2b75d8fc10d96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
diff --git a/src/Control/Monad/LogicState.hs b/src/Control/Monad/LogicState.hs
index 93be8aa..613a77c 100644
--- a/src/Control/Monad/LogicState.hs
+++ b/src/Control/Monad/LogicState.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE UndecidableInstances, Rank2Types, FlexibleInstances, FlexibleContexts, GADTs, ScopedTypeVariables, FunctionalDependencies #-}
+{-# LANGUAGE UndecidableInstances, Rank2Types, FlexibleInstances, FlexibleContexts, GADTs, ScopedTypeVariables, FunctionalDependencies, CPP #-}
 
 -------------------------------------------------------------------------
 -- |
@@ -39,6 +39,9 @@ import Control.Applicative
 
 import Control.Monad
 import Control.Monad.Identity
+#if !MIN_VERSION_base(4,11,0)
+import qualified Control.Monad.Fail as Fail
+#endif
 import Control.Monad.Trans
 
 import Control.Monad.State
@@ -83,7 +86,12 @@ instance Applicative (LogicStateT gs bs f) where
 instance Monad (LogicStateT gs bs m) where
     return a = LogicStateT ($ a)
     m >>= f = LogicStateT $ \sk -> unLogicStateT m (\a -> unLogicStateT (f a) sk)
-    fail _ = LogicStateT $ flip const
+#if !MIN_VERSION_base(4,11,0)
+    fail = Fail.fail
+#endif
+
+instance MonadFail (LogicStateT gs bs m) where
+  fail _ = LogicStateT $ flip const
 
 instance Alternative (LogicStateT gs bs f) where
     empty = LogicStateT $ flip const
diff --git a/src/Control/Monad/TransLogicState/Class.hs b/src/Control/Monad/TransLogicState/Class.hs
index 4fa61c4..267704a 100644
--- a/src/Control/Monad/TransLogicState/Class.hs
+++ b/src/Control/Monad/TransLogicState/Class.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE ScopedTypeVariables, CPP #-}
 
 module Control.Monad.TransLogicState.Class
   ( TransLogicState(..)
@@ -15,12 +15,19 @@ import Control.Arrow
 import Control.Monad.Identity
 -- import Control.Monad.Trans
 
+instance MonadFail Identity where
+  fail msg = runIdentity $ fail msg
+
 -- | Additions to MonadTrans specifically useful for LogicState
 class {- MonadTrans t => -} TransLogicState s t where
   -------------------------------------------------------------------------
   -- | Extracts the first result from a 't m' computation,
   -- failing otherwise.
+#if !MIN_VERSION_base(4,13,0)
   observeT :: (Monad m) => s -> t m a -> m a
+#else
+  observeT :: (MonadFail m) => s -> t m a -> m a
+#endif
   observeT e m = fmap head $ observeManyT e 1 m
   
   -------------------------------------------------------------------------