{-# 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 { AnyContT m a -> forall r. ContT r m a
unAnyContT :: forall r . ContT r m a }

instance Functor (AnyContT m) where
  fmap :: (a -> b) -> AnyContT m a -> AnyContT m b
fmap f :: a -> b
f p :: 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 (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f (ContT r m a -> ContT r m b)
-> (AnyContT m a -> ContT r m a) -> AnyContT m a -> ContT r m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnyContT m a -> ContT r m a
forall (m :: * -> *) a. AnyContT m a -> forall r. ContT r m a
unAnyContT (AnyContT m a -> ContT r m b) -> AnyContT m a -> ContT r m b
forall a b. (a -> b) -> a -> b
$ AnyContT m a
p

instance Applicative (AnyContT m) where
  pure :: a -> AnyContT m a
pure a :: 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 (f :: * -> *) a. Applicative f => a -> f a
pure a
a
  f :: AnyContT m (a -> b)
f <*> :: AnyContT m (a -> b) -> AnyContT m a -> AnyContT m b
<*> v :: 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 (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

instance Monad m => Monad (AnyContT m) where
  AnyContT f :: forall r. ContT r m a
f >>= :: AnyContT m a -> (a -> AnyContT m b) -> AnyContT m b
>>= k :: 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 (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= AnyContT m b -> ContT r m b
forall (m :: * -> *) a. AnyContT m a -> forall r. ContT r m a
unAnyContT (AnyContT m b -> ContT r m b)
-> (a -> AnyContT m b) -> a -> ContT r m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> AnyContT m b
k
  return :: a -> AnyContT m a
return a :: 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 (m :: * -> *) a. Monad m => a -> m a
return a
a
#if !(MIN_VERSION_base(4,13,0))
  fail s = AnyContT (ContT (\_ -> Cont.fail s))
#endif

instance MonadFail m => MonadFail (AnyContT m) where
  fail :: String -> AnyContT m a
fail s :: 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 (\_ -> String -> m r
forall (m :: * -> *) a. MonadFail m => String -> m a
Fail.fail String
s))

instance MonadIO m => MonadIO (AnyContT m) where
  liftIO :: IO a -> AnyContT m a
liftIO = 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 (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO

instance MonadTrans AnyContT where
  lift :: m a -> AnyContT m a
lift ma :: 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 (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
ma)

instance MonadThrow m => MonadThrow (AnyContT m) where
  throwM :: e -> AnyContT m a
throwM = 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 (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM

runAnyContT :: AnyContT m a -> (forall r . (a -> m r) -> m r)
runAnyContT :: AnyContT m a -> forall r. (a -> m r) -> m r
runAnyContT = 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 (ContT r m a -> (a -> m r) -> m r)
-> (AnyContT m a -> ContT r m a)
-> AnyContT m a
-> (a -> m r)
-> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnyContT m a -> ContT r m a
forall (m :: * -> *) a. AnyContT m a -> forall r. ContT r m a
unAnyContT

anyContT :: (forall r . (a -> m r) -> m r) -> AnyContT m a
anyContT :: (forall r. (a -> m r) -> m r) -> AnyContT m a
anyContT f :: 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)

withAnyContT :: (forall r . (b -> m r) -> (a -> m r)) -> AnyContT m a -> AnyContT m b
withAnyContT :: (forall r. (b -> m r) -> a -> m r) -> AnyContT m a -> AnyContT m b
withAnyContT f :: forall r. (b -> m r) -> a -> m r
f m :: 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

mapAnyContT :: (forall r . m r -> m r) -> AnyContT m a -> AnyContT m a
mapAnyContT :: (forall r. m r -> m r) -> AnyContT m a -> AnyContT m a
mapAnyContT f :: forall r. m r -> m r
f m :: 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