{- |
These functions work in arbitrary monads
but are especially helpful when working with the @CodeGenFunction@ monad.
-}
module LLVM.Extra.Monad
   {-# DEPRECATED "use utility-ht:Control.Monad.HT" #-} where

import Control.Monad (liftM2, liftM3, join, (<=<), )


{-# DEPRECATED chain "use utility-ht:Control.Monad.HT.chain" #-}
chain :: (Monad m) => [a -> m a] -> (a -> m a)
chain :: forall (m :: * -> *) a. Monad m => [a -> m a] -> a -> m a
chain =
   ((a -> m a) -> (a -> m a) -> a -> m a)
-> (a -> m a) -> [a -> m a] -> a -> m a
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (((a -> m a) -> (a -> m a) -> a -> m a)
-> (a -> m a) -> (a -> m a) -> a -> m a
forall a b c. (a -> b -> c) -> b -> a -> c
flip (a -> m a) -> (a -> m a) -> a -> m a
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
(<=<)) a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return

{-# DEPRECATED liftR2 "use utility-ht:Control.Monad.HT.liftJoin2" #-}
liftR2 :: (Monad m) => (a -> b -> m c) -> m a -> m b -> m c
liftR2 :: forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> m a -> m b -> m c
liftR2 a -> b -> m c
f m a
ma m b
mb =
   m (m c) -> m c
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join ((a -> b -> m c) -> m a -> m b -> m (m c)
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 a -> b -> m c
f m a
ma m b
mb)

{-# DEPRECATED liftR3 "use utility-ht:Control.Monad.HT.liftJoin3" #-}
liftR3 :: (Monad m) => (a -> b -> c -> m d) -> m a -> m b -> m c -> m d
liftR3 :: forall (m :: * -> *) a b c d.
Monad m =>
(a -> b -> c -> m d) -> m a -> m b -> m c -> m d
liftR3 a -> b -> c -> m d
f m a
ma m b
mb m c
mc =
   m (m d) -> m d
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join ((a -> b -> c -> m d) -> m a -> m b -> m c -> m (m d)
forall (m :: * -> *) a1 a2 a3 r.
Monad m =>
(a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
liftM3 a -> b -> c -> m d
f m a
ma m b
mb m c
mc)