module Data.Functor.Syntax where

import Data.Function.Syntax


-- * Nested Mapping

(<$$>) :: (Functor f0, Functor f1) =>
          (a -> b)
       -> f1 (f0 a)
       -> f1 (f0 b)
<$$> :: forall (f0 :: * -> *) (f1 :: * -> *) a b.
(Functor f0, Functor f1) =>
(a -> b) -> f1 (f0 a) -> f1 (f0 b)
(<$$>) = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap

infixr 8 <$$>

(<$$$>) :: (Functor f0, Functor f1, Functor f2) =>
          (a -> b)
       -> f2 (f1 (f0 a))
       -> f2 (f1 (f0 b))
<$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b.
(Functor f0, Functor f1, Functor f2) =>
(a -> b) -> f2 (f1 (f0 a)) -> f2 (f1 (f0 b))
(<$$$>) = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap

infixr 8 <$$$>

(<$$$$>) :: (Functor f0, Functor f1, Functor f2, Functor f3) =>
          (a -> b)
       -> f3 (f2 (f1 (f0 a)))
       -> f3 (f2 (f1 (f0 b)))
<$$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(a -> b) -> f3 (f2 (f1 (f0 a))) -> f3 (f2 (f1 (f0 b)))
(<$$$$>) = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap

infixr 8 <$$$$>

(<$$$$$>) :: (Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
          (a -> b)
       -> f4 (f3 (f2 (f1 (f0 a))))
       -> f4 (f3 (f2 (f1 (f0 b))))
<$$$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       (f4 :: * -> *) a b.
(Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
(a -> b) -> f4 (f3 (f2 (f1 (f0 a)))) -> f4 (f3 (f2 (f1 (f0 b))))
(<$$$$$>) = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap

infixr 8 <$$$$$>

(<&&>) :: (Functor f0, Functor f1) =>
          f1 (f0 a)
       -> (a -> b)
       -> f1 (f0 b)
<&&> :: forall (f0 :: * -> *) (f1 :: * -> *) a b.
(Functor f0, Functor f1) =>
f1 (f0 a) -> (a -> b) -> f1 (f0 b)
(<&&>) = forall a b c. (a -> b -> c) -> b -> a -> c
flip (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap)

infixl 1 <&&>

(<&&&>) :: (Functor f0, Functor f1, Functor f2) =>
          f2 (f1 (f0 a))
       -> (a -> b)
       -> f2 (f1 (f0 b))
<&&&> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b.
(Functor f0, Functor f1, Functor f2) =>
f2 (f1 (f0 a)) -> (a -> b) -> f2 (f1 (f0 b))
(<&&&>) = forall a b c. (a -> b -> c) -> b -> a -> c
flip (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap)

infixl 1 <&&&>

(<&&&&>) :: (Functor f0, Functor f1, Functor f2, Functor f3) =>
          f3 (f2 (f1 (f0 a)))
       -> (a -> b)
       -> f3 (f2 (f1 (f0 b)))
<&&&&> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
f3 (f2 (f1 (f0 a))) -> (a -> b) -> f3 (f2 (f1 (f0 b)))
(<&&&&>) = forall a b c. (a -> b -> c) -> b -> a -> c
flip (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap)

infixl 1 <&&&&>

(<&&&&&>) :: (Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
          f4 (f3 (f2 (f1 (f0 a))))
       -> (a -> b)
       -> f4 (f3 (f2 (f1 (f0 b))))
<&&&&&> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       (f4 :: * -> *) a b.
(Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
f4 (f3 (f2 (f1 (f0 a)))) -> (a -> b) -> f4 (f3 (f2 (f1 (f0 b))))
(<&&&&&>) = forall a b c. (a -> b -> c) -> b -> a -> c
flip (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap)

infixl 1 <&&&&&>

-- * Nested Application

(<$~>) :: Functor f0 =>
          f0 (a -> b)
       -> a -> f0 b
<$~> :: forall (f0 :: * -> *) a b. Functor f0 => f0 (a -> b) -> a -> f0 b
(<$~>) f0 (a -> b)
f a
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. (a -> b) -> a -> b
$ a
x) f0 (a -> b)
f

infixl 8 <$~>

(<~$>) :: Functor f0 =>
          (a -> b -> c)
       -> f0 b
       -> f0 (a -> c)
<~$> :: forall (f0 :: * -> *) a b c.
Functor f0 =>
(a -> b -> c) -> f0 b -> f0 (a -> c)
(<~$>) a -> b -> c
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c
f forall a b c. (a -> b -> c) -> b -> a -> c
-$)

infixr 8 <~$>

(<$~~>) :: Functor f0 =>
          f0 (a -> b -> c)
       -> b -> f0 (a -> c)
<$~~> :: forall (f0 :: * -> *) a b c.
Functor f0 =>
f0 (a -> b -> c) -> b -> f0 (a -> c)
(<$~~>) f0 (a -> b -> c)
f b
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> b -> a -> c
-$ b
x) f0 (a -> b -> c)
f

infixl 8 <$~~>

(<~~$>) :: Functor f0 =>
           (a -> b -> c -> d)
        -> f0 c
        -> f0 (a -> b -> d)
<~~$> :: forall (f0 :: * -> *) a b c d.
Functor f0 =>
(a -> b -> c -> d) -> f0 c -> f0 (a -> b -> d)
(<~~$>) a -> b -> c -> d
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c -> d
f forall {a} {b} {c} {d}. (a -> b -> c -> d) -> c -> a -> b -> d
--$)

infixr 8 <~~$>

(<$~~~>) :: Functor f0 =>
          f0 (a -> b -> c -> d)
       -> c -> f0 (a -> b -> d)
<$~~~> :: forall (f0 :: * -> *) a b c d.
Functor f0 =>
f0 (a -> b -> c -> d) -> c -> f0 (a -> b -> d)
(<$~~~>) f0 (a -> b -> c -> d)
f c
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall {a} {b} {c} {d}. (a -> b -> c -> d) -> c -> a -> b -> d
--$ c
x) f0 (a -> b -> c -> d)
f

infixl 8 <$~~~>

(<~~~$>) :: Functor f0 =>
            (a -> b -> c -> d -> e)
         -> f0 d
         -> f0 (a -> b -> c -> e)
<~~~$> :: forall (f0 :: * -> *) a b c d e.
Functor f0 =>
(a -> b -> c -> d -> e) -> f0 d -> f0 (a -> b -> c -> e)
(<~~~$>) a -> b -> c -> d -> e
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c -> d -> e
f forall {a} {b} {c} {d} {e}.
(a -> b -> c -> d -> e) -> d -> a -> b -> c -> e
---$)

infixr 8 <~~~$>

(<$$~>) :: (Functor f0, Functor f1) =>
           f1 (f0 (a -> b))
        -> a -> f1 (f0 b)
<$$~> :: forall (f0 :: * -> *) (f1 :: * -> *) a b.
(Functor f0, Functor f1) =>
f1 (f0 (a -> b)) -> a -> f1 (f0 b)
(<$$~>) f1 (f0 (a -> b))
f a
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) a b. Functor f0 => f0 (a -> b) -> a -> f0 b
<$~> a
x) f1 (f0 (a -> b))
f

infixl 8 <$$~>

(<~$$>) :: (Functor f0, Functor f1) =>
           (a -> b -> c)
        -> f1 (f0 b)
        -> f1 (f0 (a -> c))
<~$$> :: forall (f0 :: * -> *) (f1 :: * -> *) a b c.
(Functor f0, Functor f1) =>
(a -> b -> c) -> f1 (f0 b) -> f1 (f0 (a -> c))
(<~$$>) a -> b -> c
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c
f forall (f0 :: * -> *) a b c.
Functor f0 =>
(a -> b -> c) -> f0 b -> f0 (a -> c)
<~$>)

infixr 8 <~$$>

(<$$~~>) :: (Functor f0, Functor f1) =>
            f1 (f0 (a -> b -> c))
         -> b -> f1 (f0 (a -> c))
<$$~~> :: forall (f0 :: * -> *) (f1 :: * -> *) a b c.
(Functor f0, Functor f1) =>
f1 (f0 (a -> b -> c)) -> b -> f1 (f0 (a -> c))
(<$$~~>) f1 (f0 (a -> b -> c))
f b
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) a b c.
Functor f0 =>
f0 (a -> b -> c) -> b -> f0 (a -> c)
<$~~> b
x) f1 (f0 (a -> b -> c))
f

infixl 8 <$$~~>

(<~~$$>) :: (Functor f0, Functor f1) =>
            (a -> b -> c -> d)
         -> f1 (f0 c)
         -> f1 (f0 (a -> b -> d))
<~~$$> :: forall (f0 :: * -> *) (f1 :: * -> *) a b c d.
(Functor f0, Functor f1) =>
(a -> b -> c -> d) -> f1 (f0 c) -> f1 (f0 (a -> b -> d))
(<~~$$>) a -> b -> c -> d
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c -> d
f forall (f0 :: * -> *) a b c d.
Functor f0 =>
(a -> b -> c -> d) -> f0 c -> f0 (a -> b -> d)
<~~$>)

infixr 8 <~~$$>

(<$$~~~>) :: (Functor f0, Functor f1) =>
             f1 (f0 (a -> b -> c -> d))
          -> c -> f1 (f0 (a -> b -> d))
<$$~~~> :: forall (f0 :: * -> *) (f1 :: * -> *) a b c d.
(Functor f0, Functor f1) =>
f1 (f0 (a -> b -> c -> d)) -> c -> f1 (f0 (a -> b -> d))
(<$$~~~>) f1 (f0 (a -> b -> c -> d))
f c
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) a b c d.
Functor f0 =>
f0 (a -> b -> c -> d) -> c -> f0 (a -> b -> d)
<$~~~> c
x) f1 (f0 (a -> b -> c -> d))
f

infixl 8 <$$~~~>

(<~~~$$>) :: (Functor f0, Functor f1) =>
             (a -> b -> c -> d -> e)
          -> f1 (f0 d)
          -> f1 (f0 (a -> b -> c -> e))
<~~~$$> :: forall (f0 :: * -> *) (f1 :: * -> *) a b c d e.
(Functor f0, Functor f1) =>
(a -> b -> c -> d -> e) -> f1 (f0 d) -> f1 (f0 (a -> b -> c -> e))
(<~~~$$>) a -> b -> c -> d -> e
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c -> d -> e
f forall (f0 :: * -> *) a b c d e.
Functor f0 =>
(a -> b -> c -> d -> e) -> f0 d -> f0 (a -> b -> c -> e)
<~~~$>)

infixr 8 <~~~$$>


(<$$$~>) :: (Functor f0, Functor f1, Functor f2) =>
            f2 (f1 (f0 (a -> b)))
         -> a -> f2 (f1 (f0 b))
<$$$~> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b.
(Functor f0, Functor f1, Functor f2) =>
f2 (f1 (f0 (a -> b))) -> a -> f2 (f1 (f0 b))
(<$$$~>) f2 (f1 (f0 (a -> b)))
f a
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) (f1 :: * -> *) a b.
(Functor f0, Functor f1) =>
f1 (f0 (a -> b)) -> a -> f1 (f0 b)
<$$~> a
x) f2 (f1 (f0 (a -> b)))
f

infixl 8 <$$$~>

(<~$$$>) :: (Functor f0, Functor f1, Functor f2) =>
            (a -> b -> c)
         -> f2 (f1 (f0 b))
         -> f2 (f1 (f0 (a -> c)))
<~$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b c.
(Functor f0, Functor f1, Functor f2) =>
(a -> b -> c) -> f2 (f1 (f0 b)) -> f2 (f1 (f0 (a -> c)))
(<~$$$>) a -> b -> c
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c
f forall (f0 :: * -> *) (f1 :: * -> *) a b c.
(Functor f0, Functor f1) =>
(a -> b -> c) -> f1 (f0 b) -> f1 (f0 (a -> c))
<~$$>)

infixr 8 <~$$$>

(<$$$~~>) :: (Functor f0, Functor f1, Functor f2) =>
            f2 (f1 (f0 (a -> b -> c)))
         -> b -> f2 (f1 (f0 (a -> c)))
<$$$~~> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b c.
(Functor f0, Functor f1, Functor f2) =>
f2 (f1 (f0 (a -> b -> c))) -> b -> f2 (f1 (f0 (a -> c)))
(<$$$~~>) f2 (f1 (f0 (a -> b -> c)))
f b
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) (f1 :: * -> *) a b c.
(Functor f0, Functor f1) =>
f1 (f0 (a -> b -> c)) -> b -> f1 (f0 (a -> c))
<$$~~> b
x) f2 (f1 (f0 (a -> b -> c)))
f

infixl 8 <$$$~~>

(<~~$$$>) :: (Functor f0, Functor f1, Functor f2) =>
             (a -> b -> c -> d)
          -> f2 (f1 (f0 c))
          -> f2 (f1 (f0 (a -> b -> d)))
<~~$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b c d.
(Functor f0, Functor f1, Functor f2) =>
(a -> b -> c -> d) -> f2 (f1 (f0 c)) -> f2 (f1 (f0 (a -> b -> d)))
(<~~$$$>) a -> b -> c -> d
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c -> d
f forall (f0 :: * -> *) (f1 :: * -> *) a b c d.
(Functor f0, Functor f1) =>
(a -> b -> c -> d) -> f1 (f0 c) -> f1 (f0 (a -> b -> d))
<~~$$>)

infixr 8 <~~$$$>

(<$$$~~~>) :: (Functor f0, Functor f1, Functor f2) =>
             f2 (f1 (f0 (a -> b -> c -> d)))
          -> c -> f2 (f1 (f0 (a -> b -> d)))
<$$$~~~> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b c d.
(Functor f0, Functor f1, Functor f2) =>
f2 (f1 (f0 (a -> b -> c -> d))) -> c -> f2 (f1 (f0 (a -> b -> d)))
(<$$$~~~>) f2 (f1 (f0 (a -> b -> c -> d)))
f c
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) (f1 :: * -> *) a b c d.
(Functor f0, Functor f1) =>
f1 (f0 (a -> b -> c -> d)) -> c -> f1 (f0 (a -> b -> d))
<$$~~~> c
x) f2 (f1 (f0 (a -> b -> c -> d)))
f

infixl 8 <$$$~~~>

(<~~~$$$>) :: (Functor f0, Functor f1, Functor f2) =>
              (a -> b -> c -> d -> e)
           -> f2 (f1 (f0 d))
           -> f2 (f1 (f0 (a -> b -> c -> e)))
<~~~$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b c d e.
(Functor f0, Functor f1, Functor f2) =>
(a -> b -> c -> d -> e)
-> f2 (f1 (f0 d)) -> f2 (f1 (f0 (a -> b -> c -> e)))
(<~~~$$$>) a -> b -> c -> d -> e
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c -> d -> e
f forall (f0 :: * -> *) (f1 :: * -> *) a b c d e.
(Functor f0, Functor f1) =>
(a -> b -> c -> d -> e) -> f1 (f0 d) -> f1 (f0 (a -> b -> c -> e))
<~~~$$>)

infixr 8 <~~~$$$>


(<$$$$~>) :: (Functor f0, Functor f1, Functor f2, Functor f3) =>
             f3 (f2 (f1 (f0 (a -> b))))
          -> a -> f3 (f2 (f1 (f0 b)))
<$$$$~> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
f3 (f2 (f1 (f0 (a -> b)))) -> a -> f3 (f2 (f1 (f0 b)))
(<$$$$~>) f3 (f2 (f1 (f0 (a -> b))))
f a
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b.
(Functor f0, Functor f1, Functor f2) =>
f2 (f1 (f0 (a -> b))) -> a -> f2 (f1 (f0 b))
<$$$~> a
x) f3 (f2 (f1 (f0 (a -> b))))
f

infixl 8 <$$$$~>

(<~$$$$>) :: (Functor f0, Functor f1, Functor f2, Functor f3) =>
             (a -> b -> c)
          -> f3 (f2 (f1 (f0 b)))
          -> f3 (f2 (f1 (f0 (a -> c))))
<~$$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b c.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(a -> b -> c) -> f3 (f2 (f1 (f0 b))) -> f3 (f2 (f1 (f0 (a -> c))))
(<~$$$$>) a -> b -> c
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c
f forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b c.
(Functor f0, Functor f1, Functor f2) =>
(a -> b -> c) -> f2 (f1 (f0 b)) -> f2 (f1 (f0 (a -> c)))
<~$$$>)

infixr 8 <~$$$$>

(<$$$$~~>) :: (Functor f0, Functor f1, Functor f2, Functor f3) =>
            f3 (f2 (f1 (f0 (a -> b -> c))))
         -> b -> f3 (f2 (f1 (f0 (a -> c))))
<$$$$~~> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b c.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
f3 (f2 (f1 (f0 (a -> b -> c)))) -> b -> f3 (f2 (f1 (f0 (a -> c))))
(<$$$$~~>) f3 (f2 (f1 (f0 (a -> b -> c))))
f b
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b c.
(Functor f0, Functor f1, Functor f2) =>
f2 (f1 (f0 (a -> b -> c))) -> b -> f2 (f1 (f0 (a -> c)))
<$$$~~> b
x) f3 (f2 (f1 (f0 (a -> b -> c))))
f

infixl 8 <$$$$~~>

(<~~$$$$>) :: (Functor f0, Functor f1, Functor f2, Functor f3) =>
              (a -> b -> c -> d)
           -> f3 (f2 (f1 (f0 c)))
           -> f3 (f2 (f1 (f0 (a -> b -> d))))
<~~$$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b c d.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(a -> b -> c -> d)
-> f3 (f2 (f1 (f0 c))) -> f3 (f2 (f1 (f0 (a -> b -> d))))
(<~~$$$$>) a -> b -> c -> d
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c -> d
f forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b c d.
(Functor f0, Functor f1, Functor f2) =>
(a -> b -> c -> d) -> f2 (f1 (f0 c)) -> f2 (f1 (f0 (a -> b -> d)))
<~~$$$>)

infixr 8 <~~$$$$>

(<$$$$~~~>) :: (Functor f0, Functor f1, Functor f2, Functor f3) =>
             f3 (f2 (f1 (f0 (a -> b -> c -> d))))
          -> c -> f3 (f2 (f1 (f0 (a -> b -> d))))
<$$$$~~~> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b c d.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
f3 (f2 (f1 (f0 (a -> b -> c -> d))))
-> c -> f3 (f2 (f1 (f0 (a -> b -> d))))
(<$$$$~~~>) f3 (f2 (f1 (f0 (a -> b -> c -> d))))
f c
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b c d.
(Functor f0, Functor f1, Functor f2) =>
f2 (f1 (f0 (a -> b -> c -> d))) -> c -> f2 (f1 (f0 (a -> b -> d)))
<$$$~~~> c
x) f3 (f2 (f1 (f0 (a -> b -> c -> d))))
f

infixl 8 <$$$$~~~>

(<~~~$$$$>) :: (Functor f0, Functor f1, Functor f2, Functor f3) =>
               (a -> b -> c -> d -> e)
            -> f3 (f2 (f1 (f0 d)))
            -> f3 (f2 (f1 (f0 (a -> b -> c -> e))))
<~~~$$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b c d e.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(a -> b -> c -> d -> e)
-> f3 (f2 (f1 (f0 d))) -> f3 (f2 (f1 (f0 (a -> b -> c -> e))))
(<~~~$$$$>) a -> b -> c -> d -> e
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c -> d -> e
f forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b c d e.
(Functor f0, Functor f1, Functor f2) =>
(a -> b -> c -> d -> e)
-> f2 (f1 (f0 d)) -> f2 (f1 (f0 (a -> b -> c -> e)))
<~~~$$$>)

infixr 8 <~~~$$$$>


(<$$$$$~>) :: (Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
             f4 (f3 (f2 (f1 (f0 (a -> b)))))
          -> a -> f4 (f3 (f2 (f1 (f0 b))))
<$$$$$~> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       (f4 :: * -> *) a b.
(Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
f4 (f3 (f2 (f1 (f0 (a -> b))))) -> a -> f4 (f3 (f2 (f1 (f0 b))))
(<$$$$$~>) f4 (f3 (f2 (f1 (f0 (a -> b)))))
f a
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
f3 (f2 (f1 (f0 (a -> b)))) -> a -> f3 (f2 (f1 (f0 b)))
<$$$$~> a
x) f4 (f3 (f2 (f1 (f0 (a -> b)))))
f

infixl 8 <$$$$$~>

(<~$$$$$>) :: (Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
              (a -> b -> c)
           -> f4 (f3 (f2 (f1 (f0 b))))
           -> f4 (f3 (f2 (f1 (f0 (a -> c)))))
<~$$$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       (f4 :: * -> *) a b c.
(Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
(a -> b -> c)
-> f4 (f3 (f2 (f1 (f0 b)))) -> f4 (f3 (f2 (f1 (f0 (a -> c)))))
(<~$$$$$>) a -> b -> c
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c
f forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b c.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(a -> b -> c) -> f3 (f2 (f1 (f0 b))) -> f3 (f2 (f1 (f0 (a -> c))))
<~$$$$>)

infixr 8 <~$$$$$>

(<$$$$$~~>) :: (Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
            f4 (f3 (f2 (f1 (f0 (a -> b -> c)))))
         -> b -> f4 (f3 (f2 (f1 (f0 (a -> c)))))
<$$$$$~~> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       (f4 :: * -> *) a b c.
(Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
f4 (f3 (f2 (f1 (f0 (a -> b -> c)))))
-> b -> f4 (f3 (f2 (f1 (f0 (a -> c)))))
(<$$$$$~~>) f4 (f3 (f2 (f1 (f0 (a -> b -> c)))))
f b
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b c.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
f3 (f2 (f1 (f0 (a -> b -> c)))) -> b -> f3 (f2 (f1 (f0 (a -> c))))
<$$$$~~> b
x) f4 (f3 (f2 (f1 (f0 (a -> b -> c)))))
f

infixl 8 <$$$$$~~>

(<~~$$$$$>) :: (Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
               (a -> b -> c -> d)
            -> f4 (f3 (f2 (f1 (f0 c))))
            -> f4 (f3 (f2 (f1 (f0 (a -> b -> d)))))
<~~$$$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       (f4 :: * -> *) a b c d.
(Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
(a -> b -> c -> d)
-> f4 (f3 (f2 (f1 (f0 c)))) -> f4 (f3 (f2 (f1 (f0 (a -> b -> d)))))
(<~~$$$$$>) a -> b -> c -> d
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c -> d
f forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b c d.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(a -> b -> c -> d)
-> f3 (f2 (f1 (f0 c))) -> f3 (f2 (f1 (f0 (a -> b -> d))))
<~~$$$$>)

infixr 8 <~~$$$$$>

(<$$$$$~~~>) :: (Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
                f4 (f3 (f2 (f1 (f0 (a -> b -> c -> d)))))
             -> c -> f4 (f3 (f2 (f1 (f0 (a -> b -> d)))))
<$$$$$~~~> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       (f4 :: * -> *) a b c d.
(Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
f4 (f3 (f2 (f1 (f0 (a -> b -> c -> d)))))
-> c -> f4 (f3 (f2 (f1 (f0 (a -> b -> d)))))
(<$$$$$~~~>) f4 (f3 (f2 (f1 (f0 (a -> b -> c -> d)))))
f c
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b c d.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
f3 (f2 (f1 (f0 (a -> b -> c -> d))))
-> c -> f3 (f2 (f1 (f0 (a -> b -> d))))
<$$$$~~~> c
x) f4 (f3 (f2 (f1 (f0 (a -> b -> c -> d)))))
f

infixl 8 <$$$$$~~~>

(<~~~$$$$$>) :: (Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
                (a -> b -> c -> d -> e)
             -> f4 (f3 (f2 (f1 (f0 d))))
             -> f4 (f3 (f2 (f1 (f0 (a -> b -> c -> e)))))
<~~~$$$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       (f4 :: * -> *) a b c d e.
(Functor f0, Functor f1, Functor f2, Functor f3, Functor f4) =>
(a -> b -> c -> d -> e)
-> f4 (f3 (f2 (f1 (f0 d))))
-> f4 (f3 (f2 (f1 (f0 (a -> b -> c -> e)))))
(<~~~$$$$$>) a -> b -> c -> d -> e
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c -> d -> e
f forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b c d e.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(a -> b -> c -> d -> e)
-> f3 (f2 (f1 (f0 d))) -> f3 (f2 (f1 (f0 (a -> b -> c -> e))))
<~~~$$$$>)

infixr 8 <~~~$$$$$>

-- * Nested Compositon

(<.$>) :: Functor f0 =>
          (b -> c)
       -> f0 (a -> b)
       -> f0 (a -> c)
b -> c
f <.$> :: forall (f0 :: * -> *) b c a.
Functor f0 =>
(b -> c) -> f0 (a -> b) -> f0 (a -> c)
<.$> f0 (a -> b)
g = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (b -> c
f forall b c a. (b -> c) -> (a -> b) -> a -> c
.) f0 (a -> b)
g

infixr 8 <.$>

(<.*$>) :: Functor f0 =>
           (c -> d)
        -> f0 (a -> b -> c)
        -> f0 (a -> b -> d)
c -> d
f <.*$> :: forall (f0 :: * -> *) c d a b.
Functor f0 =>
(c -> d) -> f0 (a -> b -> c) -> f0 (a -> b -> d)
<.*$> f0 (a -> b -> c)
g = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (c -> d
f forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.*) f0 (a -> b -> c)
g

infixr 8 <.*$>

-- TODO: Expand
(<*.$>) :: Functor f0 =>
           (a -> c -> d)
        -> f0 (b -> c)
        -> f0 (a -> b -> d)
a -> c -> d
f <*.$> :: forall (f0 :: * -> *) a c d b.
Functor f0 =>
(a -> c -> d) -> f0 (b -> c) -> f0 (a -> b -> d)
<*.$> f0 (b -> c)
g = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> c -> d
f forall a c d b. (a -> c -> d) -> (b -> c) -> a -> b -> d
*.) f0 (b -> c)
g

infixr 8 <*.$>

(<.**$>) :: Functor f0 =>
           (d -> e)
        -> f0 (a -> b -> c -> d)
        -> f0 (a -> b -> c -> e)
d -> e
f <.**$> :: forall (f0 :: * -> *) d e a b c.
Functor f0 =>
(d -> e) -> f0 (a -> b -> c -> d) -> f0 (a -> b -> c -> e)
<.**$> f0 (a -> b -> c -> d)
g = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (d -> e
f forall d e a b c.
(d -> e) -> (a -> b -> c -> d) -> a -> b -> c -> e
.**) f0 (a -> b -> c -> d)
g

infixr 8 <.**$>


(<.$$>) :: (Functor f0, Functor f1) =>
          (b -> c)
       -> f1 (f0 (a -> b))
       -> f1 (f0 (a -> c))
b -> c
f <.$$> :: forall (f0 :: * -> *) (f1 :: * -> *) b c a.
(Functor f0, Functor f1) =>
(b -> c) -> f1 (f0 (a -> b)) -> f1 (f0 (a -> c))
<.$$> f1 (f0 (a -> b))
g = (b -> c
f forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall (f0 :: * -> *) (f1 :: * -> *) a b.
(Functor f0, Functor f1) =>
(a -> b) -> f1 (f0 a) -> f1 (f0 b)
<$$> f1 (f0 (a -> b))
g

infixr 8 <.$$>

(<.*$$>) :: (Functor f0, Functor f1) =>
           (c -> d)
        -> f1 (f0 (a -> b -> c))
        -> f1 (f0 (a -> b -> d))
c -> d
f <.*$$> :: forall (f0 :: * -> *) (f1 :: * -> *) c d a b.
(Functor f0, Functor f1) =>
(c -> d) -> f1 (f0 (a -> b -> c)) -> f1 (f0 (a -> b -> d))
<.*$$> f1 (f0 (a -> b -> c))
g = (c -> d
f forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.*) forall (f0 :: * -> *) (f1 :: * -> *) a b.
(Functor f0, Functor f1) =>
(a -> b) -> f1 (f0 a) -> f1 (f0 b)
<$$> f1 (f0 (a -> b -> c))
g

infixr 8 <.*$$>

(<.**$$>) :: (Functor f0, Functor f1) =>
           (d -> e)
        -> f1 (f0 (a -> b -> c -> d))
        -> f1 (f0 (a -> b -> c -> e))
d -> e
f <.**$$> :: forall (f0 :: * -> *) (f1 :: * -> *) d e a b c.
(Functor f0, Functor f1) =>
(d -> e)
-> f1 (f0 (a -> b -> c -> d)) -> f1 (f0 (a -> b -> c -> e))
<.**$$> f1 (f0 (a -> b -> c -> d))
g = (d -> e
f forall d e a b c.
(d -> e) -> (a -> b -> c -> d) -> a -> b -> c -> e
.**) forall (f0 :: * -> *) (f1 :: * -> *) a b.
(Functor f0, Functor f1) =>
(a -> b) -> f1 (f0 a) -> f1 (f0 b)
<$$> f1 (f0 (a -> b -> c -> d))
g

infixr 8 <.**$$>


(<.$$$>) :: (Functor f0, Functor f1, Functor f2) =>
          (b -> c)
       -> f2 (f1 (f0 (a -> b)))
       -> f2 (f1 (f0 (a -> c)))
b -> c
f <.$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) b c a.
(Functor f0, Functor f1, Functor f2) =>
(b -> c) -> f2 (f1 (f0 (a -> b))) -> f2 (f1 (f0 (a -> c)))
<.$$$> f2 (f1 (f0 (a -> b)))
g = (b -> c
f forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b.
(Functor f0, Functor f1, Functor f2) =>
(a -> b) -> f2 (f1 (f0 a)) -> f2 (f1 (f0 b))
<$$$> f2 (f1 (f0 (a -> b)))
g

infixr 8 <.$$$>

(<.*$$$>) :: (Functor f0, Functor f1, Functor f2) =>
           (c -> d)
        -> f2 (f1 (f0 (a -> b -> c)))
        -> f2 (f1 (f0 (a -> b -> d)))
c -> d
f <.*$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) c d a b.
(Functor f0, Functor f1, Functor f2) =>
(c -> d)
-> f2 (f1 (f0 (a -> b -> c))) -> f2 (f1 (f0 (a -> b -> d)))
<.*$$$> f2 (f1 (f0 (a -> b -> c)))
g = (c -> d
f forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.*) forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b.
(Functor f0, Functor f1, Functor f2) =>
(a -> b) -> f2 (f1 (f0 a)) -> f2 (f1 (f0 b))
<$$$> f2 (f1 (f0 (a -> b -> c)))
g

infixr 8 <.*$$$>

(<.**$$$>) :: (Functor f0, Functor f1, Functor f2) =>
           (d -> e)
        -> f2 (f1 (f0 (a -> b -> c -> d)))
        -> f2 (f1 (f0 (a -> b -> c -> e)))
d -> e
f <.**$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) d e a b c.
(Functor f0, Functor f1, Functor f2) =>
(d -> e)
-> f2 (f1 (f0 (a -> b -> c -> d)))
-> f2 (f1 (f0 (a -> b -> c -> e)))
<.**$$$> f2 (f1 (f0 (a -> b -> c -> d)))
g = (d -> e
f forall d e a b c.
(d -> e) -> (a -> b -> c -> d) -> a -> b -> c -> e
.**) forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) a b.
(Functor f0, Functor f1, Functor f2) =>
(a -> b) -> f2 (f1 (f0 a)) -> f2 (f1 (f0 b))
<$$$> f2 (f1 (f0 (a -> b -> c -> d)))
g

infixr 8 <.**$$$>


(<.$$$$>) :: (Functor f0, Functor f1, Functor f2, Functor f3) =>
          (b -> c)
       -> f3 (f2 (f1 (f0 (a -> b))))
       -> f3 (f2 (f1 (f0 (a -> c))))
b -> c
f <.$$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       b c a.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(b -> c)
-> f3 (f2 (f1 (f0 (a -> b)))) -> f3 (f2 (f1 (f0 (a -> c))))
<.$$$$> f3 (f2 (f1 (f0 (a -> b))))
g = (b -> c
f forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(a -> b) -> f3 (f2 (f1 (f0 a))) -> f3 (f2 (f1 (f0 b)))
<$$$$> f3 (f2 (f1 (f0 (a -> b))))
g

infixr 8 <.$$$$>

(<.*$$$$>) :: (Functor f0, Functor f1, Functor f2, Functor f3) =>
           (c -> d)
        -> f3 (f2 (f1 (f0 (a -> b -> c))))
        -> f3 (f2 (f1 (f0 (a -> b -> d))))
c -> d
f <.*$$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       c d a b.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(c -> d)
-> f3 (f2 (f1 (f0 (a -> b -> c))))
-> f3 (f2 (f1 (f0 (a -> b -> d))))
<.*$$$$> f3 (f2 (f1 (f0 (a -> b -> c))))
g = (c -> d
f forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.*) forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(a -> b) -> f3 (f2 (f1 (f0 a))) -> f3 (f2 (f1 (f0 b)))
<$$$$> f3 (f2 (f1 (f0 (a -> b -> c))))
g

infixr 8 <.*$$$$>

(<.**$$$$>) :: (Functor f0, Functor f1, Functor f2, Functor f3) =>
           (d -> e)
        -> f3 (f2 (f1 (f0 (a -> b -> c -> d))))
        -> f3 (f2 (f1 (f0 (a -> b -> c -> e))))
d -> e
f <.**$$$$> :: forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       d e a b c.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(d -> e)
-> f3 (f2 (f1 (f0 (a -> b -> c -> d))))
-> f3 (f2 (f1 (f0 (a -> b -> c -> e))))
<.**$$$$> f3 (f2 (f1 (f0 (a -> b -> c -> d))))
g = (d -> e
f forall d e a b c.
(d -> e) -> (a -> b -> c -> d) -> a -> b -> c -> e
.**) forall (f0 :: * -> *) (f1 :: * -> *) (f2 :: * -> *) (f3 :: * -> *)
       a b.
(Functor f0, Functor f1, Functor f2, Functor f3) =>
(a -> b) -> f3 (f2 (f1 (f0 a))) -> f3 (f2 (f1 (f0 b)))
<$$$$> f3 (f2 (f1 (f0 (a -> b -> c -> d))))
g

infixr 8 <.**$$$$>