packages feed

llvm-party-12.1.0: src/Control/Monad/AnyCont.hs

{-# 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 = lift get
  {-# INLINE get #-}
  put = lift . put
  {-# INLINE put #-}
  state = lift . state
  {-# INLINE state #-}

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