From b9a39a6ebf41ed6644c944d6a9c652d03453c977 Mon Sep 17 00:00:00 2001
From: Ross Paterson <ross@soi.city.ac.uk>
Date: Sat, 18 Feb 2017 12:33:17 +0000
Subject: [PATCH] fix for pre-AMP environments

---
 Control/Monad/Trans/Accum.hs  | 18 +++++++++---------
 Control/Monad/Trans/Select.hs |  8 ++++----
 changelog                     |  3 +++
 transformers.cabal            |  2 +-
 4 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/Control/Monad/Trans/Accum.hs b/Control/Monad/Trans/Accum.hs
index ecb664b..b1ec83d 100644
--- a/Control/Monad/Trans/Accum.hs
+++ b/Control/Monad/Trans/Accum.hs
@@ -167,8 +167,8 @@ instance (Functor m) => Functor (AccumT w m) where
     fmap f = mapAccumT $ fmap $ \ ~(a, w) -> (f a, w)
     {-# INLINE fmap #-}
 
-instance (Monoid w, Monad m) => Applicative (AccumT w m) where
-    pure a  = AccumT $ const $ pure (a, mempty)
+instance (Monoid w, Functor m, Monad m) => Applicative (AccumT w m) where
+    pure a  = AccumT $ const $ return (a, mempty)
     {-# INLINE pure #-}
     mf <*> mv = AccumT $ \ w -> do
       ~(f, w')  <- runAccumT mf w
@@ -176,15 +176,15 @@ instance (Monoid w, Monad m) => Applicative (AccumT w m) where
       return (f v, w' `mappend` w'')
     {-# INLINE (<*>) #-}
 
-instance (Monoid w, MonadPlus m) => Alternative (AccumT w m) where
+instance (Monoid w, Functor m, MonadPlus m) => Alternative (AccumT w m) where
     empty   = AccumT $ const mzero
     {-# INLINE empty #-}
-    m <|> n = AccumT $ \ w -> runAccumT m w <|> runAccumT n w
+    m <|> n = AccumT $ \ w -> runAccumT m w `mplus` runAccumT n w
     {-# INLINE (<|>) #-}
 
-instance (Monoid w, Monad m) => Monad (AccumT w m) where
+instance (Monoid w, Functor m, Monad m) => Monad (AccumT w m) where
 #if !(MIN_VERSION_base(4,8,0))
-    return a = AccumT $ const $ return (a, mempty)
+    return a  = AccumT $ const $ return (a, mempty)
     {-# INLINE return #-}
 #endif
     m >>= k  = AccumT $ \ w -> do
@@ -201,13 +201,13 @@ instance (Monoid w, Fail.MonadFail m) => Fail.MonadFail (AccumT w m) where
     {-# INLINE fail #-}
 #endif
 
-instance (Monoid w, MonadPlus m) => MonadPlus (AccumT w m) where
+instance (Monoid w, Functor m, MonadPlus m) => MonadPlus (AccumT w m) where
     mzero       = AccumT $ const mzero
     {-# INLINE mzero #-}
     m `mplus` n = AccumT $ \ w -> runAccumT m w `mplus` runAccumT n w
     {-# INLINE mplus #-}
 
-instance (Monoid w, MonadFix m) => MonadFix (AccumT w m) where
+instance (Monoid w, Functor m, MonadFix m) => MonadFix (AccumT w m) where
     mfix m = AccumT $ \ w -> mfix $ \ ~(a, _) -> runAccumT (m a) w
     {-# INLINE mfix #-}
 
@@ -217,7 +217,7 @@ instance (Monoid w) => MonadTrans (AccumT w) where
         return (a, mempty)
     {-# INLINE lift #-}
 
-instance (Monoid w, MonadIO m) => MonadIO (AccumT w m) where
+instance (Monoid w, Functor m, MonadIO m) => MonadIO (AccumT w m) where
     liftIO = lift . liftIO
     {-# INLINE liftIO #-}
 
diff --git a/Control/Monad/Trans/Select.hs b/Control/Monad/Trans/Select.hs
index 12a798e..ad61f4e 100644
--- a/Control/Monad/Trans/Select.hs
+++ b/Control/Monad/Trans/Select.hs
@@ -81,8 +81,8 @@ instance (Functor m) => Functor (SelectT r m) where
     fmap f (SelectT g) = SelectT (fmap f . g . (. f))
     {-# INLINE fmap #-}
 
-instance (Monad m) => Applicative (SelectT r m) where
-    pure = lift . pure
+instance (Functor m, Monad m) => Applicative (SelectT r m) where
+    pure = lift . return
     {-# INLINE pure #-}
     SelectT gf <*> SelectT gx = SelectT $ \ k -> do
         let h f = liftM f (gx (k . f))
@@ -90,7 +90,7 @@ instance (Monad m) => Applicative (SelectT r m) where
         h f
     {-# INLINE (<*>) #-}
 
-instance (MonadPlus m) => Alternative (SelectT r m) where
+instance (Functor m, MonadPlus m) => Alternative (SelectT r m) where
     empty = mzero
     {-# INLINE empty #-}
     (<|>) = mplus
@@ -98,7 +98,7 @@ instance (MonadPlus m) => Alternative (SelectT r m) where
 
 instance (Monad m) => Monad (SelectT r m) where
 #if !(MIN_VERSION_base(4,8,0))
-    return = pure
+    return = lift . return
     {-# INLINE return #-}
 #endif
     SelectT g >>= f = SelectT $ \ k -> do
diff --git a/changelog b/changelog
index 2ad7539..7f7590b 100644
--- a/changelog
+++ b/changelog
@@ -1,5 +1,8 @@
 -*-change-log-*-
 
+0.5.3.1 Ross Paterson <R.Paterson@city.ac.uk> Feb 2017
+	* Fixed for pre-AMP environments
+
 0.5.3.0 Ross Paterson <R.Paterson@city.ac.uk> Feb 2017
 	* Added AccumT and SelectT monad transformers
 	* Deprecated ListT
diff --git a/transformers.cabal b/transformers.cabal
index 024eea8..08646ed 100644
--- a/transformers.cabal
+++ b/transformers.cabal
@@ -1,5 +1,5 @@
 name:         transformers
-version:      0.5.3.0
+version:      0.5.3.1
 license:      BSD3
 license-file: LICENSE
 author:       Andy Gill, Ross Paterson
-- 
GitLab