@@ -1,3 +1,4 @@
1+{-# LANGUAGE UndecidableInstances #-}
1#include "inline.hs"
2#include "inline.hs"
@@ -35,6 +36,9 @@ import Control.Applicative (Alternative(..), liftA2)
35import Control.Exception (assert, Exception(..))
36import Control.Exception (assert, Exception(..))
36import Control.Monad (MonadPlus(..), ap)
37import Control.Monad (MonadPlus(..), ap)
37import Control.Monad.Catch (MonadCatch, MonadThrow(..), try)
38import Control.Monad.Catch (MonadCatch, MonadThrow(..), try)
39+import Control.Monad.IO.Class (MonadIO, liftIO)
40+import Control.Monad.Reader.Class (MonadReader, ask, local)
41+import Control.Monad.State.Class (MonadState, get, put)
38#if MIN_VERSION_base(4,9,0)
42#if MIN_VERSION_base(4,9,0)
39import qualified Control.Monad.Fail as Fail
43import qualified Control.Monad.Fail as Fail
@@ -411,6 +415,25 @@ instance Monad m => Fail.MonadFail (Parser m a) where
411 fail = die
415 fail = die
418+instance (MonadThrow m, MonadReader r m, MonadCatch m) => MonadReader r (Parser m a) where
420+ ask = fromEffect ask
421+ {-# INLINE local #-}
422+ local f (fromParserK -> dp) =
423+ toParserK $ local f dp
426+instance (MonadThrow m, MonadState s m) => MonadState s (Parser m a) where
428+ get = fromEffect get
430+ put = fromEffect . put
433+instance (MonadThrow m, MonadIO m) => MonadIO (Parser m a) where
434+ {-# INLINE liftIO #-}
435+ liftIO = fromEffect . liftIO
414-------------------------------------------------------------------------------
437-------------------------------------------------------------------------------
415-- Alternative
438-- Alternative
416-------------------------------------------------------------------------------
439-------------------------------------------------------------------------------