module Control.Concatenative (
bi, tri, biSp, triSp, biAp, triAp, ifte,
(>>@), dup, swap, both,
(>>>), (&&&), (***), first, second
) where
import Control.Arrow
bi :: (a -> b) -> (a -> c) -> (b -> c -> d) -> a -> d
bi f g c = \x-> c (f x) (g x)
tri :: (a -> b) -> (a -> c) -> (a -> d) -> (b -> c -> d -> e) -> a -> e
tri f g h c = \x-> c (f x) (g x) (h x)
biSp :: (a -> c) -> (b -> d) -> (c -> d -> e) -> a -> b -> e
biSp f g c = \x y-> c (f x) (g y)
triSp :: (a -> d) -> (b -> e) -> (c -> f) -> (d -> e -> f -> g) -> a -> b -> c -> g
triSp f g h c = \x y z-> c (f x) (g y) (h z)
biAp :: (t -> t1) -> (t1 -> t1 -> t2) -> t -> t -> t2
biAp f c = \x y-> c (f x) (f y)
triAp :: (a -> b) -> (b -> b -> b -> c) -> a -> a -> a -> c
triAp f c = \x y z-> c (f x) (f y) (f z)
ifte :: (a -> Bool)
-> (a -> b)
-> (a -> b)
-> a -> b
ifte test ca cb = \x ->
if test x then ca x else cb x
(>>@) :: Arrow a => a b (x,y) -> (x -> y -> z) -> a b z
a >>@ f = a >>> arr (\(x,y) -> f x y)
both :: Arrow a => a b c -> a (b,b) (c,c)
both a = first a >>> second a
dup :: Arrow a => a b (b,b)
dup = arr (\x-> (x,x))
swap :: Arrow a => a (x,y) (y,x)
swap = arr (\(x,y) -> (y,x))