{-# 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)