(original) (raw)

{-# LANGUAGE RankNTypes #-} {-# LANGUAGE Safe #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE QuantifiedConstraints #-}

{-# OPTIONS_GHC -Wno-redundant-constraints #-}

module Control.Monad.Cont.Class ( MonadCont(..), label, label_, liftCallCC, ) where

import Data.Kind (Type) import Control.Monad.Fix (fix) import Control.Monad.Trans.Cont (ContT) import qualified Control.Monad.Trans.Cont as ContT import Control.Monad.Trans.Except (ExceptT) import qualified Control.Monad.Trans.Except as Except import Control.Monad.Trans.Identity (IdentityT) import qualified Control.Monad.Trans.Identity as Identity import Control.Monad.Trans.Maybe (MaybeT) import qualified Control.Monad.Trans.Maybe as Maybe import Control.Monad.Trans.Reader (ReaderT) import qualified Control.Monad.Trans.Reader as Reader import qualified Control.Monad.Trans.RWS.Lazy as LazyRWS import qualified Control.Monad.Trans.RWS.Strict as StrictRWS import qualified Control.Monad.Trans.State.Lazy as LazyState import qualified Control.Monad.Trans.State.Strict as StrictState import qualified Control.Monad.Trans.Writer.Lazy as LazyWriter import qualified Control.Monad.Trans.Writer.Strict as StrictWriter import Control.Monad.Trans.Accum (AccumT) import qualified Control.Monad.Trans.Accum as Accum import qualified Control.Monad.Trans.RWS.CPS as CPSRWS import qualified Control.Monad.Trans.Writer.CPS as CPSWriter import Control.Monad.Trans.Class (MonadTrans (lift)) import Control.Monad.Signatures (CallCC) import Control.Monad (join)

class Monad m => MonadCont (m :: Type -> Type) where

[callCC](Control.Monad.Cont.Class.html#callCC) :: (([a](#local-6989586621679044483) -> [m](#local-6989586621679044489) [b](#local-6989586621679044482)) -> [m](#local-6989586621679044489) [a](#local-6989586621679044483)) -> [m](#local-6989586621679044489) [a](#local-6989586621679044483)
{-# MINIMAL [callCC](Control.Monad.Cont.Class.html#callCC) #-}

instance forall k (r :: k) (m :: (k -> Type)) . MonadCont (ContT r m) where callCC :: forall a b. ((a -> ContT r m b) -> ContT r m a) -> ContT r m a callCC = forall {k} a (r :: k) (m :: k -> *) b. ((a -> ContT r m b) -> ContT r m a) -> ContT r m a ContT.callCC

instance MonadCont m => MonadCont (ExceptT e m) where callCC :: forall a b. ((a -> ExceptT e m b) -> ExceptT e m a) -> ExceptT e m a callCC = forall (m :: * -> *) e a b. CallCC m (Either e a) (Either e b) -> CallCC (ExceptT e m) a b Except.liftCallCC forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a callCC

instance MonadCont m => MonadCont (IdentityT m) where callCC :: forall a b. ((a -> IdentityT m b) -> IdentityT m a) -> IdentityT m a callCC = forall (m :: * -> *) a b. CallCC m a b -> CallCC (IdentityT m) a b Identity.liftCallCC forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a callCC

instance MonadCont m => MonadCont (MaybeT m) where callCC :: forall a b. ((a -> MaybeT m b) -> MaybeT m a) -> MaybeT m a callCC = forall (m :: * -> *) a b. CallCC m (Maybe a) (Maybe b) -> CallCC (MaybeT m) a b Maybe.liftCallCC forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a callCC

instance MonadCont m => MonadCont (ReaderT r m) where callCC :: forall a b. ((a -> ReaderT r m b) -> ReaderT r m a) -> ReaderT r m a callCC = forall (m :: * -> *) a b r. CallCC m a b -> CallCC (ReaderT r m) a b Reader.liftCallCC 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 :: forall a b. ((a -> RWST r w s m b) -> RWST r w s m a) -> RWST r w s m a callCC = 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' 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 :: forall a b. ((a -> RWST r w s m b) -> RWST r w s m a) -> RWST r w s m a callCC = 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' forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a callCC

instance MonadCont m => MonadCont (LazyState.StateT s m) where callCC :: forall a b. ((a -> StateT s m b) -> StateT s m a) -> StateT s m a callCC = forall (m :: * -> *) a s b. CallCC m (a, s) (b, s) -> CallCC (StateT s m) a b LazyState.liftCallCC' forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a callCC

instance MonadCont m => MonadCont (StrictState.StateT s m) where callCC :: forall a b. ((a -> StateT s m b) -> StateT s m a) -> StateT s m a callCC = forall (m :: * -> *) a s b. CallCC m (a, s) (b, s) -> CallCC (StateT s m) a b StrictState.liftCallCC' 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 :: forall a b. ((a -> WriterT w m b) -> WriterT w m a) -> WriterT w m a callCC = forall w (m :: * -> *) a b. Monoid w => CallCC m (a, w) (b, w) -> CallCC (WriterT w m) a b LazyWriter.liftCallCC 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 :: forall a b. ((a -> WriterT w m b) -> WriterT w m a) -> WriterT w m a callCC = forall w (m :: * -> *) a b. Monoid w => CallCC m (a, w) (b, w) -> CallCC (WriterT w m) a b StrictWriter.liftCallCC forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a callCC

instance (Monoid w, MonadCont m) => MonadCont (CPSRWS.RWST r w s m) where callCC :: forall a b. ((a -> RWST r w s m b) -> RWST r w s m a) -> RWST r w s m a callCC = forall (m :: * -> *) a s w b r. CallCC m (a, s, w) (b, s, w) -> CallCC (RWST r w s m) a b CPSRWS.liftCallCC' forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a callCC

instance (Monoid w, MonadCont m) => MonadCont (CPSWriter.WriterT w m) where callCC :: forall a b. ((a -> WriterT w m b) -> WriterT w m a) -> WriterT w m a callCC = forall (m :: * -> *) a w b. CallCC m (a, w) (b, w) -> CallCC (WriterT w m) a b CPSWriter.liftCallCC forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a callCC

instance ( Monoid w , MonadCont m ) => MonadCont (AccumT w m) where callCC :: forall a b. ((a -> AccumT w m b) -> AccumT w m a) -> AccumT w m a callCC = forall (m :: * -> *) a w b. CallCC m (a, w) (b, w) -> CallCC (AccumT w m) a b Accum.liftCallCC forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a callCC

label :: MonadCont m => a -> m (a -> m b, a) label :: forall (m :: * -> *) a b. MonadCont m => a -> m (a -> m b, a) label a a = forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a callCC forall a b. (a -> b) -> a -> b $ (a -> m b, a) -> m b k -> let go :: a -> m b go a b = (a -> m b, a) -> m b k (a -> m b go, a b) in forall (m :: * -> *) a. Monad m => a -> m a return (a -> m b go, a a)

label_ :: MonadCont m => m (m a) label_ :: forall (m :: * -> *) a. MonadCont m => m (m a) label_ = forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a callCC forall a b. (a -> b) -> a -> b $ forall (m :: * -> *) a. Monad m => a -> m a return forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a. (a -> a) -> a fix

liftCallCC :: forall (t :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type) (b :: Type) . (MonadTrans t, Monad m, forall (m' :: Type -> Type) . Monad m' => Monad (t m')) => CallCC m (t m a) b -> CallCC (t m) a b liftCallCC :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b. (MonadTrans t, Monad m, forall (m' :: * -> *). Monad m' => Monad (t m')) => CallCC m (t m a) b -> CallCC (t m) a b liftCallCC CallCC m (t m a) b f (a -> t m b) -> t m a g = forall (m :: * -> ) a. Monad m => m (m a) -> m a join forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . CallCC m (t m a) b f forall a b. (a -> b) -> a -> b $ \t m a -> m b exit -> forall (f :: * -> ) a. Applicative f => a -> f a pure forall a b. (a -> b) -> a -> b $ (a -> t m b) -> t m a g (forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . t m a -> m b exit forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (f :: * -> *) a. Applicative f => a -> f a pure)