{-# 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 #-}