{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 702
{-# LANGUAGE Safe #-}
{-# LANGUAGE DeriveGeneric #-}
#endif
#if __GLASGOW_HASKELL__ >= 706
{-# LANGUAGE PolyKinds #-}
#endif
#if __GLASGOW_HASKELL__ >= 710 && __GLASGOW_HASKELL__ < 802
{-# LANGUAGE AutoDeriveTypeable #-}
#endif
module Control.Monad.Trans.Cont (
Cont,
cont,
runCont,
evalCont,
mapCont,
withCont,
reset, shift,
ContT(..),
evalContT,
mapContT,
withContT,
callCC,
resetT, shiftT,
liftLocal,
) where
import Control.Monad.IO.Class
import Control.Monad.Trans.Class
import Data.Functor.Identity
#if !(MIN_VERSION_base(4,8,0))
import Control.Applicative
#endif
#if MIN_VERSION_base(4,9,0)
import qualified Control.Monad.Fail as Fail
#endif
#if __GLASGOW_HASKELL__ >= 704
import GHC.Generics
#endif
type Cont r = ContT r Identity
cont :: ((a -> r) -> r) -> Cont r a
cont :: forall a r. ((a -> r) -> r) -> Cont r a
cont (a -> r) -> r
f = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (\ a -> Identity r
c -> forall a. a -> Identity a
Identity ((a -> r) -> r
f (forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Identity r
c)))
{-# INLINE cont #-}
runCont
:: Cont r a
-> (a -> r)
-> r
runCont :: forall r a. Cont r a -> (a -> r) -> r
runCont Cont r a
m a -> r
k = forall a. Identity a -> a
runIdentity (forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT Cont r a
m (forall a. a -> Identity a
Identity forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> r
k))
{-# INLINE runCont #-}
evalCont :: Cont r r -> r
evalCont :: forall r. Cont r r -> r
evalCont Cont r r
m = forall a. Identity a -> a
runIdentity (forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT Cont r r
m)
{-# INLINE evalCont #-}
mapCont :: (r -> r) -> Cont r a -> Cont r a
mapCont :: forall r a. (r -> r) -> Cont r a -> Cont r a
mapCont r -> r
f = forall {k} (m :: k -> *) (r :: k) a.
(m r -> m r) -> ContT r m a -> ContT r m a
mapContT (forall a. a -> Identity a
Identity forall b c a. (b -> c) -> (a -> b) -> a -> c
. r -> r
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Identity a -> a
runIdentity)
{-# INLINE mapCont #-}
withCont :: ((b -> r) -> (a -> r)) -> Cont r a -> Cont r b
withCont :: forall b r a. ((b -> r) -> a -> r) -> Cont r a -> Cont r b
withCont (b -> r) -> a -> r
f = forall {k} b (m :: k -> *) (r :: k) a.
((b -> m r) -> a -> m r) -> ContT r m a -> ContT r m b
withContT ((forall a. a -> Identity a
Identity forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (b -> r) -> a -> r
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
.))
{-# INLINE withCont #-}
reset :: Cont r r -> Cont r' r
reset :: forall r r'. Cont r r -> Cont r' r
reset = forall (m :: * -> *) r r'. Monad m => ContT r m r -> ContT r' m r
resetT
{-# INLINE reset #-}
shift :: ((a -> r) -> Cont r r) -> Cont r a
shift :: forall a r. ((a -> r) -> Cont r r) -> Cont r a
shift (a -> r) -> Cont r r
f = forall (m :: * -> *) a r.
Monad m =>
((a -> m r) -> ContT r m r) -> ContT r m a
shiftT ((a -> r) -> Cont r r
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
.))
{-# INLINE shift #-}
newtype ContT r m a = ContT { forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT :: (a -> m r) -> m r }
#if __GLASGOW_HASKELL__ >= 704
deriving (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k (r :: k) (m :: k -> *) a x.
Rep (ContT r m a) x -> ContT r m a
forall k (r :: k) (m :: k -> *) a x.
ContT r m a -> Rep (ContT r m a) x
$cto :: forall k (r :: k) (m :: k -> *) a x.
Rep (ContT r m a) x -> ContT r m a
$cfrom :: forall k (r :: k) (m :: k -> *) a x.
ContT r m a -> Rep (ContT r m a) x
Generic)
#endif
evalContT :: (Monad m) => ContT r m r -> m r
evalContT :: forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT ContT r m r
m = forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT ContT r m r
m forall (m :: * -> *) a. Monad m => a -> m a
return
{-# INLINE evalContT #-}
mapContT :: (m r -> m r) -> ContT r m a -> ContT r m a
mapContT :: forall {k} (m :: k -> *) (r :: k) a.
(m r -> m r) -> ContT r m a -> ContT r m a
mapContT m r -> m r
f ContT r m a
m = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ m r -> m r
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT ContT r m a
m
{-# INLINE mapContT #-}
withContT :: ((b -> m r) -> (a -> m r)) -> ContT r m a -> ContT r m b
withContT :: forall {k} b (m :: k -> *) (r :: k) a.
((b -> m r) -> a -> m r) -> ContT r m a -> ContT r m b
withContT (b -> m r) -> a -> m r
f ContT r m a
m = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT ContT r m a
m forall b c a. (b -> c) -> (a -> b) -> a -> c
. (b -> m r) -> a -> m r
f
{-# INLINE withContT #-}
instance Functor (ContT r m) where
fmap :: forall a b. (a -> b) -> ContT r m a -> ContT r m b
fmap a -> b
f ContT r m a
m = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ \ b -> m r
c -> forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT ContT r m a
m (b -> m r
c forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f)
{-# INLINE fmap #-}
instance Applicative (ContT r m) where
pure :: forall a. a -> ContT r m a
pure a
x = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (forall a b. (a -> b) -> a -> b
$ a
x)
{-# INLINE pure #-}
ContT r m (a -> b)
f <*> :: forall a b. ContT r m (a -> b) -> ContT r m a -> ContT r m b
<*> ContT r m a
v = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ \ b -> m r
c -> forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT ContT r m (a -> b)
f forall a b. (a -> b) -> a -> b
$ \ a -> b
g -> forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT ContT r m a
v (b -> m r
c forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
g)
{-# INLINE (<*>) #-}
ContT r m a
m *> :: forall a b. ContT r m a -> ContT r m b -> ContT r m b
*> ContT r m b
k = ContT r m a
m forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a
_ -> ContT r m b
k
{-# INLINE (*>) #-}
instance Monad (ContT r m) where
#if !(MIN_VERSION_base(4,8,0))
return x = ContT ($ x)
{-# INLINE return #-}
#endif
ContT r m a
m >>= :: forall a b. ContT r m a -> (a -> ContT r m b) -> ContT r m b
>>= a -> ContT r m b
k = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ \ b -> m r
c -> forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT ContT r m a
m (\ a
x -> forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT (a -> ContT r m b
k a
x) b -> m r
c)
{-# INLINE (>>=) #-}
#if MIN_VERSION_base(4,9,0)
instance (Fail.MonadFail m) => Fail.MonadFail (ContT r m) where
fail :: forall a. String -> ContT r m a
fail String
msg = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ \ a -> m r
_ -> forall (m :: * -> *) a. MonadFail m => String -> m a
Fail.fail String
msg
{-# INLINE fail #-}
#endif
instance MonadTrans (ContT r) where
lift :: forall (m :: * -> *) a. Monad m => m a -> ContT r m a
lift m a
m = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (m a
m forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=)
{-# INLINE lift #-}
instance (MonadIO m) => MonadIO (ContT r m) where
liftIO :: forall a. IO a -> ContT r m a
liftIO = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
{-# INLINE liftIO #-}
callCC :: ((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
callCC (a -> ContT r m b) -> ContT r m a
f = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ \ a -> m r
c -> forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT ((a -> ContT r m b) -> ContT r m a
f (\ a
x -> forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ \ b -> m r
_ -> a -> m r
c a
x)) a -> m r
c
{-# INLINE callCC #-}
resetT :: (Monad m) => ContT r m r -> ContT r' m r
resetT :: forall (m :: * -> *) r r'. Monad m => ContT r m r -> ContT r' m r
resetT = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT
{-# INLINE resetT #-}
shiftT :: (Monad m) => ((a -> m r) -> ContT r m r) -> ContT r m a
shiftT :: forall (m :: * -> *) a r.
Monad m =>
((a -> m r) -> ContT r m r) -> ContT r m a
shiftT (a -> m r) -> ContT r m r
f = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m r) -> ContT r m r
f)
{-# INLINE shiftT #-}
liftLocal :: (Monad m) => m r' -> ((r' -> r') -> m r -> m r) ->
(r' -> r') -> ContT r m a -> ContT r m a
liftLocal :: forall (m :: * -> *) r' r a.
Monad m =>
m r'
-> ((r' -> r') -> m r -> m r)
-> (r' -> r')
-> ContT r m a
-> ContT r m a
liftLocal m r'
ask (r' -> r') -> m r -> m r
local r' -> r'
f ContT r m a
m = forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ \ a -> m r
c -> do
r'
r <- m r'
ask
(r' -> r') -> m r -> m r
local r' -> r'
f (forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT ContT r m a
m ((r' -> r') -> m r -> m r
local (forall a b. a -> b -> a
const r'
r) forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> m r
c))
{-# INLINE liftLocal #-}