module Wumpus.Basic.Utils.Combinators
(
fork
, prod
, forkA
, bindR
, bindAsk
, bindInto
, rlift1
, bindR2
, bindAskR2
, rlift2
) where
import Control.Applicative
fork :: (a -> b) -> (a -> c) -> a -> (b,c)
fork f g a = (f a, g a)
prod :: (a -> c) -> (b -> d) -> (a,b) -> (c,d)
prod f g (a,b) = (f a, g b)
forkA :: Applicative f => f a -> f b -> f (a,b)
forkA af ab = (,) <$> af <*> ab
infixl 1 `bindR`, `bindR2`
bindR :: Monad m => (r -> m a) -> (a -> r -> m b) -> r -> m b
bindR cxma cxmf = \x -> cxma x >>= \a -> cxmf a x
bindAsk :: Monad m => m a -> (a -> r1 -> m b) -> r1 -> m b
bindAsk ma cxmf r1 = ma >>= \a -> cxmf a r1
bindInto :: Monad m => (r1 -> m a) -> (a -> m b) -> r1 -> m b
bindInto cxma mf r1 = cxma r1 >>= \a -> mf a
rlift1 :: Monad m => m a -> (r -> m a)
rlift1 ma = \_ -> ma
bindR2 :: Monad m
=> (r1 -> r2 -> m a) -> (a -> r1 -> r2 -> m b) -> r1 -> r2 -> m b
bindR2 cxma cxmf = \x y -> cxma x y >>= \a -> cxmf a x y
bindAskR2 :: Monad m => m a -> (a -> r1 -> r2 -> m b) -> r1 -> r2 -> m b
bindAskR2 ma cxmf r1 r2 = ma >>= \a -> cxmf a r1 r2
rlift2 :: Monad m => m a -> (r1 -> r2 -> m a)
rlift2 ma = \_ _ -> ma