{-# OPTIONS -fno-warn-orphans #-}

module Control.Monad.Ology.Specific.ContT
    ( module Control.Monad.Trans.Cont
    , module Control.Monad.Ology.Specific.ContT
    ) where

import Control.Monad.Ology.General
import Control.Monad.Ology.Specific.ReaderT
import Control.Monad.Ology.Specific.StateT
import Control.Monad.Trans.Cont hiding (callCC)
import qualified Control.Monad.Trans.Cont as T
import Import

instance TransConstraint Functor (ContT s) where
    hasTransConstraint :: forall (m :: Type -> Type). Functor m => Dict (Functor (ContT s m))
hasTransConstraint = forall (a :: Constraint). a => Dict a
Dict

instance TransConstraint Applicative (ContT s) where
    hasTransConstraint :: forall (m :: Type -> Type).
Applicative m =>
Dict (Applicative (ContT s m))
hasTransConstraint = forall (a :: Constraint). a => Dict a
Dict

instance TransConstraint Monad (ContT s) where
    hasTransConstraint :: forall (m :: Type -> Type). Monad m => Dict (Monad (ContT s m))
hasTransConstraint = forall (a :: Constraint). a => Dict a
Dict

instance TransConstraint MonadIO (ContT s) where
    hasTransConstraint :: forall (m :: Type -> Type). MonadIO m => Dict (MonadIO (ContT s m))
hasTransConstraint = forall (a :: Constraint). a => Dict a
Dict

instance TransConstraint MonadFail (ContT s) where
    hasTransConstraint :: forall (m :: Type -> Type).
MonadFail m =>
Dict (MonadFail (ContT s m))
hasTransConstraint = forall (a :: Constraint). a => Dict a
Dict

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 -> Type) b.
((a -> ContT r m b) -> ContT r m a) -> ContT r m a
T.callCC

instance MonadTransCoerce (ContT r) where
    transCoerce :: forall (m1 :: Type -> Type) (m2 :: Type -> Type).
Coercible m1 m2 =>
Dict (Coercible (ContT r m1) (ContT r m2))
transCoerce = forall (a :: Constraint). a => Dict a
Dict

updateContT :: (m r -> m r) -> ContT r m ()
updateContT :: forall {k} (m :: k -> Type) (r :: k). (m r -> m r) -> ContT r m ()
updateContT m r -> m r
m = forall {k} (r :: k) (m :: k -> Type) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ \() -> m r
umr -> m r -> m r
m forall a b. (a -> b) -> a -> b
$ () -> m r
umr ()

stateToReaderContT :: Monad m => StateT s m a -> ContT r (ReaderT s m) a
stateToReaderContT :: forall (m :: Type -> Type) s a r.
Monad m =>
StateT s m a -> ContT r (ReaderT s m) a
stateToReaderContT (StateT s -> m (a, s)
sma) =
    forall {k} (r :: k) (m :: k -> Type) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ \a -> ReaderT s m r
c ->
        forall r (m :: Type -> Type) a. (r -> m a) -> ReaderT r m a
ReaderT forall a b. (a -> b) -> a -> b
$ \s
olds -> do
            (a
a, s
news) <- s -> m (a, s)
sma s
olds
            forall r (m :: Type -> Type) a. ReaderT r m a -> r -> m a
runReaderT (a -> ReaderT s m r
c a
a) s
news

hoistContT :: (m1 r1 -> m2 r2) -> (m2 r2 -> m1 r1) -> ContT r1 m1 a -> ContT r2 m2 a
hoistContT :: forall {k} {k} (m1 :: k -> Type) (r1 :: k) (m2 :: k -> Type)
       (r2 :: k) a.
(m1 r1 -> m2 r2)
-> (m2 r2 -> m1 r1) -> ContT r1 m1 a -> ContT r2 m2 a
hoistContT m1 r1 -> m2 r2
m12 m2 r2 -> m1 r1
m21 (ContT (a -> m1 r1) -> m1 r1
amrmr) = forall {k} (r :: k) (m :: k -> Type) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ \a -> m2 r2
c -> m1 r1 -> m2 r2
m12 forall a b. (a -> b) -> a -> b
$ (a -> m1 r1) -> m1 r1
amrmr (m2 r2 -> m1 r1
m21 forall {k} (cat :: k -> k -> Type) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> m2 r2
c)