{-# LANGUAGE TypeFamilies, NoMonomorphismRestriction, NoImplicitPrelude, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, UndecidableInstances #-} module Control.RMonad.Trans.Cont where import Prelude hiding (return, fail, (>>=), (>>), (=<<), sequence, sequence_, mapM, mapM_) import Control.RMonad import Control.RMonad.Trans import Data.Suitable import Control.Monad.Trans.Cont instance (Suitable m a, Suitable m r) => Suitable (ContT r m) a where data Constraints (ContT r m) a = (Suitable m a, Suitable m r) => ContTConstraints constraints _ = ContTConstraints instance RMonad m => RMonad (ContT r m) where return a = ContT $ \c -> c a m >>= f = ContT $ \c -> runContT m $ \a -> runContT (f a) c instance RMonadTrans (ContT r) where lift m = withResConstraints $ \ContTConstraints -> ContT $ \c -> m >>= c instance RMonadIO m => RMonadIO (ContT r m) where liftIO m = withResConstraints $ \ContTConstraints -> lift $ liftIO m