{-# LANGUAGE
  CPP, RankNTypes
  #-}
module Control.Monad.Trans.AnyCont where

import LLVM.Prelude

import Control.Monad.Catch
import Control.Monad.Cont as Cont
import Control.Monad.Fail as Fail

newtype AnyContT m a = AnyContT { forall (m :: * -> *) a. AnyContT m a -> forall r. ContT r m a
unAnyContT :: forall r . ContT r m a }

instance Functor (AnyContT m) where
  fmap :: forall a b. (a -> b) -> AnyContT m a -> AnyContT m b
fmap a -> b
f AnyContT m a
p = (forall r. ContT r m b) -> AnyContT m b
forall (m :: * -> *) a. (forall r. ContT r m a) -> AnyContT m a
AnyContT ((forall r. ContT r m b) -> AnyContT m b)
-> (forall r. ContT r m b) -> AnyContT m b
forall a b. (a -> b) -> a -> b
$ (a -> b) -> ContT r m a -> ContT r m b
forall a b. (a -> b) -> ContT r m a -> ContT r m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f (AnyContT m a -> forall r. ContT r m a
forall (m :: * -> *) a. AnyContT m a -> forall r. ContT r m a
unAnyContT AnyContT m a
p)
  {-# INLINE fmap #-}

instance Applicative (AnyContT m) where
  pure :: forall a. a -> AnyContT m a
pure a
a = (forall r. ContT r m a) -> AnyContT m a
forall (m :: * -> *) a. (forall r. ContT r m a) -> AnyContT m a
AnyContT ((forall r. ContT r m a) -> AnyContT m a)
-> (forall r. ContT r m a) -> AnyContT m a
forall a b. (a -> b) -> a -> b
$ a -> ContT r m a
forall a. a -> ContT r m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a
  {-# INLINE pure #-}
  AnyContT m (a -> b)
f <*> :: forall a b. AnyContT m (a -> b) -> AnyContT m a -> AnyContT m b
<*> AnyContT m a
v = (forall r. ContT r m b) -> AnyContT m b
forall (m :: * -> *) a. (forall r. ContT r m a) -> AnyContT m a
AnyContT ((forall r. ContT r m b) -> AnyContT m b)
-> (forall r. ContT r m b) -> AnyContT m b
forall a b. (a -> b) -> a -> b
$ AnyContT m (a -> b) -> forall r. ContT r m (a -> b)
forall (m :: * -> *) a. AnyContT m a -> forall r. ContT r m a
unAnyContT AnyContT m (a -> b)
f ContT r m (a -> b) -> ContT r m a -> ContT r m b
forall a b. ContT r m (a -> b) -> ContT r m a -> ContT r m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AnyContT m a -> forall r. ContT r m a
forall (m :: * -> *) a. AnyContT m a -> forall r. ContT r m a
unAnyContT AnyContT m a
v
  {-# INLINE (<*>) #-}

instance Monad m => Monad (AnyContT m) where
  AnyContT forall r. ContT r m a
f >>= :: forall a b. AnyContT m a -> (a -> AnyContT m b) -> AnyContT m b
>>= a -> AnyContT m b
k = (forall r. ContT r m b) -> AnyContT m b
forall (m :: * -> *) a. (forall r. ContT r m a) -> AnyContT m a
AnyContT ((forall r. ContT r m b) -> AnyContT m b)
-> (forall r. ContT r m b) -> AnyContT m b
forall a b. (a -> b) -> a -> b
$ ContT r m a
forall r. ContT r m a
f ContT r m a -> (a -> ContT r m b) -> ContT r m b
forall a b. ContT r m a -> (a -> ContT r m b) -> ContT r m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a
x -> AnyContT m b -> forall r. ContT r m b
forall (m :: * -> *) a. AnyContT m a -> forall r. ContT r m a
unAnyContT (a -> AnyContT m b
k a
x)
  {-# INLINE (>>=) #-}
  return :: forall a. a -> AnyContT m a
return a
a = (forall r. ContT r m a) -> AnyContT m a
forall (m :: * -> *) a. (forall r. ContT r m a) -> AnyContT m a
AnyContT ((forall r. ContT r m a) -> AnyContT m a)
-> (forall r. ContT r m a) -> AnyContT m a
forall a b. (a -> b) -> a -> b
$ a -> ContT r m a
forall a. a -> ContT r m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
  {-# INLINE return #-}
#if !(MIN_VERSION_base(4,13,0))
  fail s = AnyContT (ContT (\_ -> Cont.fail s))
  {-# INLINE fail #-}
#endif

instance MonadFail m => MonadFail (AnyContT m) where
  fail :: forall a. String -> AnyContT m a
fail String
s = (forall r. ContT r m a) -> AnyContT m a
forall (m :: * -> *) a. (forall r. ContT r m a) -> AnyContT m a
AnyContT (((a -> m r) -> m r) -> ContT r m a
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (\a -> m r
_ -> String -> m r
forall a. String -> m a
forall (m :: * -> *) a. MonadFail m => String -> m a
Fail.fail String
s))
  {-# INLINE fail #-}

instance MonadIO m => MonadIO (AnyContT m) where
  liftIO :: forall a. IO a -> AnyContT m a
liftIO = m a -> AnyContT m a
forall (m :: * -> *) a. Monad m => m a -> AnyContT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> AnyContT m a) -> (IO a -> m a) -> IO a -> AnyContT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
  {-# INLINE liftIO #-}

instance MonadTrans AnyContT where
  lift :: forall (m :: * -> *) a. Monad m => m a -> AnyContT m a
lift m a
ma = (forall r. ContT r m a) -> AnyContT m a
forall (m :: * -> *) a. (forall r. ContT r m a) -> AnyContT m a
AnyContT (m a -> ContT r m a
forall (m :: * -> *) a. Monad m => m a -> ContT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
ma)
  {-# INLINE lift #-}

instance MonadThrow m => MonadThrow (AnyContT m) where
  throwM :: forall e a. Exception e => e -> AnyContT m a
throwM = m a -> AnyContT m a
forall (m :: * -> *) a. Monad m => m a -> AnyContT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> AnyContT m a) -> (e -> m a) -> e -> AnyContT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> m a
forall e a. Exception e => e -> m a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM
  {-# INLINE throwM #-}

runAnyContT :: AnyContT m a -> forall r . (a -> m r) -> m r
runAnyContT :: forall (m :: * -> *) a. AnyContT m a -> forall r. (a -> m r) -> m r
runAnyContT AnyContT m a
k = ContT r m a -> (a -> m r) -> m r
forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT (AnyContT m a -> forall r. ContT r m a
forall (m :: * -> *) a. AnyContT m a -> forall r. ContT r m a
unAnyContT AnyContT m a
k)
{-# INLINE runAnyContT #-}

runAnyContT' :: (a -> m r) -> AnyContT m a -> m r
runAnyContT' :: forall a (m :: * -> *) r. (a -> m r) -> AnyContT m a -> m r
runAnyContT' a -> m r
f AnyContT m a
k = ContT r m a -> (a -> m r) -> m r
forall {k} (r :: k) (m :: k -> *) a.
ContT r m a -> (a -> m r) -> m r
runContT (AnyContT m a -> forall r. ContT r m a
forall (m :: * -> *) a. AnyContT m a -> forall r. ContT r m a
unAnyContT AnyContT m a
k) a -> m r
f
{-# INLINE runAnyContT' #-}

anyContT :: (forall r . (a -> m r) -> m r) -> AnyContT m a
anyContT :: forall a (m :: * -> *).
(forall r. (a -> m r) -> m r) -> AnyContT m a
anyContT forall r. (a -> m r) -> m r
f = (forall r. ContT r m a) -> AnyContT m a
forall (m :: * -> *) a. (forall r. ContT r m a) -> AnyContT m a
AnyContT (((a -> m r) -> m r) -> ContT r m a
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (a -> m r) -> m r
forall r. (a -> m r) -> m r
f)
{-# INLINE anyContT #-}

withAnyContT :: (forall r . (b -> m r) -> (a -> m r)) -> AnyContT m a -> AnyContT m b
withAnyContT :: forall b (m :: * -> *) a.
(forall r. (b -> m r) -> a -> m r) -> AnyContT m a -> AnyContT m b
withAnyContT forall r. (b -> m r) -> a -> m r
f AnyContT m a
m = (forall r. (b -> m r) -> m r) -> AnyContT m b
forall a (m :: * -> *).
(forall r. (a -> m r) -> m r) -> AnyContT m a
anyContT ((forall r. (b -> m r) -> m r) -> AnyContT m b)
-> (forall r. (b -> m r) -> m r) -> AnyContT m b
forall a b. (a -> b) -> a -> b
$ AnyContT m a -> forall r. (a -> m r) -> m r
forall (m :: * -> *) a. AnyContT m a -> forall r. (a -> m r) -> m r
runAnyContT AnyContT m a
m ((a -> m r) -> m r)
-> ((b -> m r) -> a -> m r) -> (b -> m r) -> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (b -> m r) -> a -> m r
forall r. (b -> m r) -> a -> m r
f
{-# INLINE withAnyContT #-}

mapAnyContT :: (forall r . m r -> m r) -> AnyContT m a -> AnyContT m a
mapAnyContT :: forall (m :: * -> *) a.
(forall r. m r -> m r) -> AnyContT m a -> AnyContT m a
mapAnyContT forall r. m r -> m r
f AnyContT m a
m = (forall r. (a -> m r) -> m r) -> AnyContT m a
forall a (m :: * -> *).
(forall r. (a -> m r) -> m r) -> AnyContT m a
anyContT ((forall r. (a -> m r) -> m r) -> AnyContT m a)
-> (forall r. (a -> m r) -> m r) -> AnyContT m a
forall a b. (a -> b) -> a -> b
$ m r -> m r
forall r. m r -> m r
f (m r -> m r) -> ((a -> m r) -> m r) -> (a -> m r) -> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnyContT m a -> forall r. (a -> m r) -> m r
forall (m :: * -> *) a. AnyContT m a -> forall r. (a -> m r) -> m r
runAnyContT AnyContT m a
m
{-# INLINE mapAnyContT #-}