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