{-# LANGUAGE
  MultiParamTypeClasses,
  UndecidableInstances
  #-}
module Control.Monad.AnyCont (
    MonadAnyCont(..),
    ScopeAnyCont(..),
    AnyContT(..),
    MonadTransAnyCont(..),
    runAnyContT,
    withAnyContT,
    mapAnyContT
  ) where

import Prelude

import Control.Monad.Trans.AnyCont
import Control.Monad.AnyCont.Class
import Control.Monad.Trans.Class
import Control.Monad.State.Class
import Control.Monad.Error.Class

instance MonadState s m => MonadState s (AnyContT m) where
  get :: AnyContT m s
get = m s -> AnyContT m s
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m s
forall s (m :: * -> *). MonadState s m => m s
get
  put :: s -> AnyContT m ()
put = m () -> AnyContT m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> AnyContT m ()) -> (s -> m ()) -> s -> AnyContT m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> m ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put
  state :: (s -> (a, s)) -> AnyContT m a
state = m a -> AnyContT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> AnyContT m a)
-> ((s -> (a, s)) -> m a) -> (s -> (a, s)) -> AnyContT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (s -> (a, s)) -> m a
forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a
state

instance MonadError e m => MonadError e (AnyContT m) where
  throwError :: e -> AnyContT m a
throwError = m a -> AnyContT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> AnyContT m a) -> (e -> m a) -> e -> AnyContT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError
  x :: AnyContT m a
x catchError :: AnyContT m a -> (e -> AnyContT m a) -> AnyContT m a
`catchError` h :: e -> AnyContT m a
h = (forall r. (a -> m r) -> m r) -> AnyContT m a
forall a (m :: * -> *).
(forall r. (a -> m r) -> m r) -> AnyContT m a
anyContT ((forall r. (a -> m r) -> m r) -> AnyContT m a)
-> (forall r. (a -> m r) -> m r) -> AnyContT m a
forall a b. (a -> b) -> a -> b
$ \f :: a -> m r
f -> (AnyContT m a -> (a -> m r) -> m r
forall (m :: * -> *) a. AnyContT m a -> forall r. (a -> m r) -> m r
runAnyContT AnyContT m a
x a -> m r
f) m r -> (e -> m r) -> m r
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
`catchError` (\e :: e
e -> AnyContT m a -> (a -> m r) -> m r
forall (m :: * -> *) a. AnyContT m a -> forall r. (a -> m r) -> m r
runAnyContT (e -> AnyContT m a
h e
e) a -> m r
f)