{-# LANGUAGE TypeFamilies, NoMonomorphismRestriction, NoImplicitPrelude, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, UndecidableInstances #-} {-# LANGUAGE CPP #-} #if __GLASGOW_HASKELL__>=700 {-# LANGUAGE RebindableSyntax #-} #endif module Control.RMonad.Trans.Cont where import Control.RMonad.Prelude import Control.RMonad.Trans import Data.Suitable import Control.Monad.Trans.Cont data instance Constraints (ContT r m) a = (Suitable m a, Suitable m r) => ContTConstraints instance (Suitable m a, Suitable m r) => Suitable (ContT r m) a where 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