module Util where
import Control.Arrow;
import Control.Monad;
list :: (a -> [a] -> b) -> b -> [a] -> b;
list f y [] = y;
list f y (x:xs) = f x xs;
swap :: (a,b) -> (b,a);
swap (x,y) = (y,x);
infixr 3 &=&;
(&=&) :: Monad m => (a -> m b) -> (a -> m c) -> a -> m (b, c);
(&=&) = curry $ uncurry (&&&) >>> (uncurry (liftM2 (,)) .);
infixr 3 *=*;
(*=*) :: Monad m => (a -> m b) -> (c -> m d) -> (a, c) -> m (b, d);
(*=*) = curry $ uncurry (***) >>> (uncurry (liftM2 (,)) .);
applyA :: ArrowApply a => a b (a b c) -> a b c;
applyA = (&&& (arr id)) >>> (>>> app);
apM :: Monad m => m (a -> m b) -> a -> m b;
apM = fmap join . (. return) . ap;
infixr 1 >*>;
(>*>) :: Monad m => (a -> m b) -> (b -> c) -> a -> m c;
f >*> g = f >=> return . g;
infixl 1 >>*;
(>>*) :: Monad m => m a -> (a -> b) -> m b;
(>>*) = flip liftM;
(<<) :: Monad m => m a -> m b -> m a;
(<<) = flip (>>);