packages feed

llvm-general-3.3.0.0: src/Control/Monad/AnyCont.hs

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

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 = lift get
  put = lift . put
  state = lift . state

instance MonadError e m => MonadError e (AnyContT m) where
  throwError = lift . throwError
  x `catchError` h = anyContT $ \f -> (runAnyContT x f) `catchError` (\e -> runAnyContT (h e) f)