{-# LANGUAGE CPP #-}
module Control.Monad.Cont.Class (
MonadCont(..),
) where
import Control.Monad.Trans.Cont (ContT)
import qualified Control.Monad.Trans.Cont as ContT
import Control.Monad.Trans.Error as Error
import Control.Monad.Trans.Except as Except
import Control.Monad.Trans.Identity as Identity
import Control.Monad.Trans.List as List
import Control.Monad.Trans.Maybe as Maybe
import Control.Monad.Trans.Reader as Reader
import Control.Monad.Trans.RWS.Lazy as LazyRWS
import Control.Monad.Trans.RWS.Strict as StrictRWS
import Control.Monad.Trans.State.Lazy as LazyState
import Control.Monad.Trans.State.Strict as StrictState
import Control.Monad.Trans.Writer.Lazy as LazyWriter
import Control.Monad.Trans.Writer.Strict as StrictWriter
import Control.Monad
import Data.Monoid
class Monad m => MonadCont m where
callCC :: ((a -> m b) -> m a) -> m a
#if __GLASGOW_HASKELL__ >= 707
{-# MINIMAL callCC #-}
#endif
instance MonadCont (ContT r m) where
callCC :: ((a -> ContT r m b) -> ContT r m a) -> ContT r m a
callCC = ((a -> ContT r m b) -> ContT r m a) -> ContT r m a
forall k a (r :: k) (m :: k -> *) b.
((a -> ContT r m b) -> ContT r m a) -> ContT r m a
ContT.callCC
instance (Error e, MonadCont m) => MonadCont (ErrorT e m) where
callCC :: ((a -> ErrorT e m b) -> ErrorT e m a) -> ErrorT e m a
callCC = CallCC m (Either e a) (Either e b)
-> ((a -> ErrorT e m b) -> ErrorT e m a) -> ErrorT e m a
forall (m :: * -> *) e a b.
CallCC m (Either e a) (Either e b) -> CallCC (ErrorT e m) a b
Error.liftCallCC CallCC m (Either e a) (Either e b)
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC
instance MonadCont m => MonadCont (ExceptT e m) where
callCC :: ((a -> ExceptT e m b) -> ExceptT e m a) -> ExceptT e m a
callCC = CallCC m (Either e a) (Either e b)
-> ((a -> ExceptT e m b) -> ExceptT e m a) -> ExceptT e m a
forall (m :: * -> *) e a b.
CallCC m (Either e a) (Either e b) -> CallCC (ExceptT e m) a b
Except.liftCallCC CallCC m (Either e a) (Either e b)
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC
instance MonadCont m => MonadCont (IdentityT m) where
callCC :: ((a -> IdentityT m b) -> IdentityT m a) -> IdentityT m a
callCC = CallCC m a b
-> ((a -> IdentityT m b) -> IdentityT m a) -> IdentityT m a
forall (m :: * -> *) a b. CallCC m a b -> CallCC (IdentityT m) a b
Identity.liftCallCC CallCC m a b
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC
instance MonadCont m => MonadCont (ListT m) where
callCC :: ((a -> ListT m b) -> ListT m a) -> ListT m a
callCC = CallCC m [a] [b] -> ((a -> ListT m b) -> ListT m a) -> ListT m a
forall (m :: * -> *) a b. CallCC m [a] [b] -> CallCC (ListT m) a b
List.liftCallCC CallCC m [a] [b]
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC
instance MonadCont m => MonadCont (MaybeT m) where
callCC :: ((a -> MaybeT m b) -> MaybeT m a) -> MaybeT m a
callCC = CallCC m (Maybe a) (Maybe b)
-> ((a -> MaybeT m b) -> MaybeT m a) -> MaybeT m a
forall (m :: * -> *) a b.
CallCC m (Maybe a) (Maybe b) -> CallCC (MaybeT m) a b
Maybe.liftCallCC CallCC m (Maybe a) (Maybe b)
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC
instance MonadCont m => MonadCont (ReaderT r m) where
callCC :: ((a -> ReaderT r m b) -> ReaderT r m a) -> ReaderT r m a
callCC = CallCC m a b
-> ((a -> ReaderT r m b) -> ReaderT r m a) -> ReaderT r m a
forall (m :: * -> *) a b r.
CallCC m a b -> CallCC (ReaderT r m) a b
Reader.liftCallCC CallCC m a b
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC
instance (Monoid w, MonadCont m) => MonadCont (LazyRWS.RWST r w s m) where
callCC :: ((a -> RWST r w s m b) -> RWST r w s m a) -> RWST r w s m a
callCC = CallCC m (a, s, w) (b, s, w)
-> ((a -> RWST r w s m b) -> RWST r w s m a) -> RWST r w s m a
forall w (m :: * -> *) a s b r.
Monoid w =>
CallCC m (a, s, w) (b, s, w) -> CallCC (RWST r w s m) a b
LazyRWS.liftCallCC' CallCC m (a, s, w) (b, s, w)
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC
instance (Monoid w, MonadCont m) => MonadCont (StrictRWS.RWST r w s m) where
callCC :: ((a -> RWST r w s m b) -> RWST r w s m a) -> RWST r w s m a
callCC = CallCC m (a, s, w) (b, s, w)
-> ((a -> RWST r w s m b) -> RWST r w s m a) -> RWST r w s m a
forall w (m :: * -> *) a s b r.
Monoid w =>
CallCC m (a, s, w) (b, s, w) -> CallCC (RWST r w s m) a b
StrictRWS.liftCallCC' CallCC m (a, s, w) (b, s, w)
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC
instance MonadCont m => MonadCont (LazyState.StateT s m) where
callCC :: ((a -> StateT s m b) -> StateT s m a) -> StateT s m a
callCC = CallCC m (a, s) (b, s)
-> ((a -> StateT s m b) -> StateT s m a) -> StateT s m a
forall (m :: * -> *) a s b.
CallCC m (a, s) (b, s) -> CallCC (StateT s m) a b
LazyState.liftCallCC' CallCC m (a, s) (b, s)
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC
instance MonadCont m => MonadCont (StrictState.StateT s m) where
callCC :: ((a -> StateT s m b) -> StateT s m a) -> StateT s m a
callCC = CallCC m (a, s) (b, s)
-> ((a -> StateT s m b) -> StateT s m a) -> StateT s m a
forall (m :: * -> *) a s b.
CallCC m (a, s) (b, s) -> CallCC (StateT s m) a b
StrictState.liftCallCC' CallCC m (a, s) (b, s)
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC
instance (Monoid w, MonadCont m) => MonadCont (LazyWriter.WriterT w m) where
callCC :: ((a -> WriterT w m b) -> WriterT w m a) -> WriterT w m a
callCC = CallCC m (a, w) (b, w)
-> ((a -> WriterT w m b) -> WriterT w m a) -> WriterT w m a
forall w (m :: * -> *) a b.
Monoid w =>
CallCC m (a, w) (b, w) -> CallCC (WriterT w m) a b
LazyWriter.liftCallCC CallCC m (a, w) (b, w)
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC
instance (Monoid w, MonadCont m) => MonadCont (StrictWriter.WriterT w m) where
callCC :: ((a -> WriterT w m b) -> WriterT w m a) -> WriterT w m a
callCC = CallCC m (a, w) (b, w)
-> ((a -> WriterT w m b) -> WriterT w m a) -> WriterT w m a
forall w (m :: * -> *) a b.
Monoid w =>
CallCC m (a, w) (b, w) -> CallCC (WriterT w m) a b
StrictWriter.liftCallCC CallCC m (a, w) (b, w)
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC