module Control.Joint.Operators where

import Control.Joint.Core ((:.), (:=))

(<$$>) :: (Functor t, Functor u) => (a -> b) -> t :. u := a -> t :. u := b
<$$> :: (a -> b) -> ((t :. u) := a) -> (t :. u) := b
(<$$>) = (u a -> u b) -> ((t :. u) := a) -> (t :. u) := b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
(<$>) ((u a -> u b) -> ((t :. u) := a) -> (t :. u) := b)
-> ((a -> b) -> u a -> u b)
-> (a -> b)
-> ((t :. u) := a)
-> (t :. u) := b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b) -> u a -> u b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
(<$>)

(<$$$>) :: (Functor t, Functor u, Functor v)
	=> (a -> b) -> t :. u :. v := a -> t :. u :. v := b
<$$$> :: (a -> b) -> ((t :. (u :. v)) := a) -> (t :. (u :. v)) := b
(<$$$>) = (u (v a) -> u (v b))
-> ((t :. (u :. v)) := a) -> (t :. (u :. v)) := b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
(<$>) ((u (v a) -> u (v b))
 -> ((t :. (u :. v)) := a) -> (t :. (u :. v)) := b)
-> ((a -> b) -> u (v a) -> u (v b))
-> (a -> b)
-> ((t :. (u :. v)) := a)
-> (t :. (u :. v)) := b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (v a -> v b) -> u (v a) -> u (v b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
(<$>) ((v a -> v b) -> u (v a) -> u (v b))
-> ((a -> b) -> v a -> v b) -> (a -> b) -> u (v a) -> u (v b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b) -> v a -> v b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
(<$>)

(<$$$$>) :: (Functor t, Functor u, Functor v, Functor w)
	=> (a -> b) -> t :. u :. v :. w := a -> t :. u :. v :. w := b
<$$$$> :: (a -> b)
-> ((t :. (u :. (v :. w))) := a) -> (t :. (u :. (v :. w))) := b
(<$$$$>) = (u (v (w a)) -> u (v (w b)))
-> ((t :. (u :. (v :. w))) := a) -> (t :. (u :. (v :. w))) := b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
(<$>) ((u (v (w a)) -> u (v (w b)))
 -> ((t :. (u :. (v :. w))) := a) -> (t :. (u :. (v :. w))) := b)
-> ((a -> b) -> u (v (w a)) -> u (v (w b)))
-> (a -> b)
-> ((t :. (u :. (v :. w))) := a)
-> (t :. (u :. (v :. w))) := b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (v (w a) -> v (w b)) -> u (v (w a)) -> u (v (w b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
(<$>) ((v (w a) -> v (w b)) -> u (v (w a)) -> u (v (w b)))
-> ((a -> b) -> v (w a) -> v (w b))
-> (a -> b)
-> u (v (w a))
-> u (v (w b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (w a -> w b) -> v (w a) -> v (w b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
(<$>) ((w a -> w b) -> v (w a) -> v (w b))
-> ((a -> b) -> w a -> w b) -> (a -> b) -> v (w a) -> v (w b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b) -> w a -> w b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
(<$>)


(<**>) :: (Applicative t, Applicative u) => t :. u := (a -> b) -> t :. u := a -> t :. u := b
(t :. u) := (a -> b)
f <**> :: ((t :. u) := (a -> b)) -> ((t :. u) := a) -> (t :. u) := b
<**> (t :. u) := a
x = u (a -> b) -> u a -> u b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>) (u (a -> b) -> u a -> u b)
-> ((t :. u) := (a -> b)) -> t (u a -> u b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (t :. u) := (a -> b)
f t (u a -> u b) -> ((t :. u) := a) -> (t :. u) := b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (t :. u) := a
x

(<***>) :: (Applicative t, Applicative u, Applicative v) => t :. u :. v := (a -> b)
	-> t :. u :. v := a -> t :. u :. v := b
(t :. (u :. v)) := (a -> b)
f <***> :: ((t :. (u :. v)) := (a -> b))
-> ((t :. (u :. v)) := a) -> (t :. (u :. v)) := b
<***> (t :. (u :. v)) := a
x = ((u :. v) := (a -> b)) -> ((u :. v) := a) -> (u :. v) := b
forall (t :: * -> *) (u :: * -> *) a b.
(Applicative t, Applicative u) =>
((t :. u) := (a -> b)) -> ((t :. u) := a) -> (t :. u) := b
(<**>) (((u :. v) := (a -> b)) -> ((u :. v) := a) -> (u :. v) := b)
-> ((t :. (u :. v)) := (a -> b))
-> t (((u :. v) := a) -> (u :. v) := b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (t :. (u :. v)) := (a -> b)
f t (((u :. v) := a) -> (u :. v) := b)
-> ((t :. (u :. v)) := a) -> (t :. (u :. v)) := b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (t :. (u :. v)) := a
x

(<****>) :: (Applicative t, Applicative u, Applicative v, Applicative w)
	=> t :. u :. v :. w := (a -> b)
	-> t :. u :. v :. w := a
	-> t :. u :. v :. w := b
(t :. (u :. (v :. w))) := (a -> b)
f <****> :: ((t :. (u :. (v :. w))) := (a -> b))
-> ((t :. (u :. (v :. w))) := a) -> (t :. (u :. (v :. w))) := b
<****> (t :. (u :. (v :. w))) := a
x = ((u :. (v :. w)) := (a -> b))
-> ((u :. (v :. w)) := a) -> (u :. (v :. w)) := b
forall (t :: * -> *) (u :: * -> *) (v :: * -> *) a b.
(Applicative t, Applicative u, Applicative v) =>
((t :. (u :. v)) := (a -> b))
-> ((t :. (u :. v)) := a) -> (t :. (u :. v)) := b
(<***>) (((u :. (v :. w)) := (a -> b))
 -> ((u :. (v :. w)) := a) -> (u :. (v :. w)) := b)
-> ((t :. (u :. (v :. w))) := (a -> b))
-> t (((u :. (v :. w)) := a) -> (u :. (v :. w)) := b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (t :. (u :. (v :. w))) := (a -> b)
f t (((u :. (v :. w)) := a) -> (u :. (v :. w)) := b)
-> ((t :. (u :. (v :. w))) := a) -> (t :. (u :. (v :. w))) := b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (t :. (u :. (v :. w))) := a
x

($>>=) :: (Functor u, Monad t) => (a -> t b) -> u :. t := a -> u :. t := b
a -> t b
f $>>= :: (a -> t b) -> ((u :. t) := a) -> (u :. t) := b
$>>= (u :. t) := a
x = (t a -> (a -> t b) -> t b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> t b
f) (t a -> t b) -> ((u :. t) := a) -> (u :. t) := b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (u :. t) := a
x

(>>=$) :: Monad t => (t b -> c) -> (a -> t b) -> t a -> c
t b -> c
f >>=$ :: (t b -> c) -> (a -> t b) -> t a -> c
>>=$ a -> t b
g = t b -> c
f (t b -> c) -> (t a -> t b) -> t a -> c
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (t a -> (a -> t b) -> t b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> t b
g)