{-# 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 :: ((a -> m b) -> m a) -> m a
    {-# MINIMAL 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 = ((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 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 = CallCC m (Either e a) (Either e b) -> CallCC (ExceptT e m) a b
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 a b. ((a -> m b) -> m a) -> m a
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 = CallCC m a b -> CallCC (IdentityT m) a b
forall (m :: * -> *) a b. CallCC m a b -> CallCC (IdentityT m) a b
Identity.liftCallCC CallCC m a b
forall a b. ((a -> m b) -> m a) -> m a
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 = CallCC m (Maybe a) (Maybe b) -> CallCC (MaybeT m) a b
forall (m :: * -> *) a b.
CallCC m (Maybe a) (Maybe b) -> CallCC (MaybeT m) a b
Maybe.liftCallCC CallCC m (Maybe a) (Maybe b)
forall a b. ((a -> m b) -> m a) -> m a
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 = CallCC m a b -> CallCC (ReaderT r m) a b
forall (m :: * -> *) a b r.
CallCC m a b -> CallCC (ReaderT r m) a b
Reader.liftCallCC CallCC m a b
forall a b. ((a -> m b) -> m a) -> m a
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 = CallCC m (a, s, w) (b, s, w) -> CallCC (RWST r w s m) a b
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 a b. ((a -> m b) -> m a) -> m a
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 = CallCC m (a, s, w) (b, s, w) -> CallCC (RWST r w s m) a b
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 a b. ((a -> m b) -> m a) -> m a
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 = CallCC m (a, s) (b, s) -> CallCC (StateT s m) a b
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 a b. ((a -> m b) -> m a) -> m a
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 = CallCC m (a, s) (b, s) -> CallCC (StateT s m) a b
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 a b. ((a -> m b) -> m a) -> m a
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 = CallCC m (a, w) (b, w) -> CallCC (WriterT w m) a b
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 a b. ((a -> m b) -> m a) -> m a
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 = CallCC m (a, w) (b, w) -> CallCC (WriterT w m) a b
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 a b. ((a -> m b) -> m a) -> m a
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 = CallCC m (a, s, w) (b, s, w) -> CallCC (RWST r w s m) a b
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' CallCC m (a, s, w) (b, s, w)
forall a b. ((a -> m b) -> m a) -> m a
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 = CallCC m (a, w) (b, w) -> CallCC (WriterT w m) a b
forall (m :: * -> *) a w b.
CallCC m (a, w) (b, w) -> CallCC (WriterT w m) a b
CPSWriter.liftCallCC CallCC m (a, w) (b, w)
forall a b. ((a -> m b) -> m a) -> m a
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 = CallCC m (a, w) (b, w) -> CallCC (AccumT w m) a b
forall (m :: * -> *) a w b.
CallCC m (a, w) (b, w) -> CallCC (AccumT w m) a b
Accum.liftCallCC CallCC m (a, w) (b, w)
forall a b. ((a -> m b) -> m a) -> m a
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 = (((a -> m b, a) -> m b) -> m (a -> m b, a)) -> m (a -> m b, a)
forall a b. ((a -> m b) -> m a) -> m a
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC ((((a -> m b, a) -> m b) -> m (a -> m b, a)) -> m (a -> m b, a))
-> (((a -> m b, a) -> m b) -> m (a -> m b, a)) -> m (a -> m b, a)
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 (a -> m b, a) -> m (a -> m b, a)
forall a. a -> m a
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_ = ((m a -> m a) -> m (m a)) -> m (m a)
forall a b. ((a -> m b) -> m a) -> m a
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC (((m a -> m a) -> m (m a)) -> m (m a))
-> ((m a -> m a) -> m (m a)) -> m (m a)
forall a b. (a -> b) -> a -> b
$ m a -> m (m a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (m a -> m (m a))
-> ((m a -> m a) -> m a) -> (m a -> m a) -> m (m a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (m a -> m a) -> m a
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 = t m (t m a) -> t m a
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (t m (t m a) -> t m a)
-> (((t m a -> m b) -> m (t m a)) -> t m (t m a))
-> ((t m a -> m b) -> m (t m a))
-> t m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m (t m a) -> t m (t m a)
forall (m :: * -> *) a. Monad m => m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (t m a) -> t m (t m a))
-> CallCC m (t m a) b
-> ((t m a -> m b) -> m (t m a))
-> t m (t m a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CallCC m (t m a) b
f (((t m a -> m b) -> m (t m a)) -> t m a)
-> ((t m a -> m b) -> m (t m a)) -> t m a
forall a b. (a -> b) -> a -> b
$ \t m a -> m b
exit -> t m a -> m (t m a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (t m a -> m (t m a)) -> t m a -> m (t m a)
forall a b. (a -> b) -> a -> b
$ (a -> t m b) -> t m a
g (m b -> t m b
forall (m :: * -> *) a. Monad m => m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m b -> t m b) -> (a -> m b) -> a -> t m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m a -> m b
exit (t m a -> m b) -> (a -> t m a) -> a -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> t m a
forall a. a -> t m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure)