packages feed

descript-lang-0.2.0.0: src/Core/Control/Applicative.hs

module Core.Control.Applicative
       ( pure2
       , pure3
       , (<<*>>)
       , (<<<*>>>) ) where

-- | Lifts 'pure' to 2 applicatives.
pure2 :: (Applicative wa, Applicative wb) => a -> wa (wb a)
pure2 = pure . pure

-- | Lifts 'pure' to 3 applicatives.
pure3 :: (Applicative wa, Applicative wb, Applicative wc) => a -> wa (wb (wc a))
pure3 = pure2 . pure

-- | Lifts '<*>' to 2 applicatives.
infixr 3 <<*>>
(<<*>>) :: (Applicative wa, Applicative wb) => wa (wb (a -> b)) -> wa (wb a) -> wa (wb b)
f <<*>> x = (<*>) <$> f <*> x

-- | Lifts '<*>' to 3 applicatives.
infixr 3 <<<*>>>
(<<<*>>>) :: (Applicative wa, Applicative wb, Applicative wc) => wa (wb (wc (a -> b))) -> wa (wb (wc a)) -> wa (wb (wc b))
f <<<*>>> x = (<<*>>) <$> f <*> x