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