{-# LANGUAGE MultiParamTypeClasses, UndecidableInstances #-} module Control.Monad.AnyCont ( MonadAnyCont(..), ScopeAnyCont(..), AnyContT(..), MonadTransAnyCont(..), runAnyContT, 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 (m :: * -> *) a. Monad m => m a -> AnyContT m a 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 {-# INLINE get #-} put :: s -> AnyContT m () put = m () -> AnyContT m () forall (m :: * -> *) a. Monad m => m a -> AnyContT m a 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 {-# INLINE put #-} state :: forall a. (s -> (a, s)) -> AnyContT m a state = m a -> AnyContT m a forall (m :: * -> *) a. Monad m => 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 a. (s -> (a, s)) -> m a forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state {-# INLINE state #-} instance MonadError e m => MonadError e (AnyContT m) where throwError :: forall a. e -> AnyContT m a throwError = m a -> AnyContT m a forall (m :: * -> *) a. Monad m => 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 a. e -> m a forall e (m :: * -> *) a. MonadError e m => e -> m a throwError {-# INLINE throwError #-} AnyContT m a x catchError :: forall a. AnyContT m a -> (e -> AnyContT m a) -> AnyContT m a `catchError` 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 $ \a -> m r f -> (AnyContT m a -> forall r. (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 a. m a -> (e -> m a) -> m a forall e (m :: * -> *) a. MonadError e m => m a -> (e -> m a) -> m a `catchError` (\e e -> AnyContT m a -> forall r. (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)