{-# LANGUAGE UndecidableInstances #-}
module Pandora.Paradigm.Primary.Transformer.Jet where

import Pandora.Pattern.Category ((<------))
import Pandora.Pattern.Functor.Covariant (Covariant ((<-|-), (<-|--), (<-|-|-), (<-|-)))
import Pandora.Pattern.Functor.Traversable (Traversable ((<-/-)), (<-/-/-))
import Pandora.Paradigm.Algebraic ((<-*--))

data Jet t a = Jet a (Jet t (t a))

instance Covariant (->) (->) t => Covariant (->) (->) (Jet t) where
	a -> b
f <-|- :: (a -> b) -> Jet t a -> Jet t b
<-|- Jet a
x Jet t (t a)
xs = b -> Jet t (t b) -> Jet t b
forall (t :: * -> *) a. a -> Jet t (t a) -> Jet t a
Jet
		(b -> Jet t (t b) -> Jet t b) -> b -> Jet t (t b) -> Jet t b
forall (m :: * -> * -> *) a b. Category m => m (m a b) (m a b)
<------ a -> b
f a
x
		(Jet t (t b) -> Jet t b) -> Jet t (t b) -> Jet t b
forall (m :: * -> * -> *) a b. Category m => m (m a b) (m a b)
<------ a -> b
f (a -> b) -> Jet t (t a) -> Jet t (t b)
forall (source :: * -> * -> *) (target :: * -> * -> *)
       (t :: * -> *) (u :: * -> *) a b.
(Covariant source target t,
 Covariant source (Betwixt source target) u,
 Covariant (Betwixt source target) target t) =>
source a b -> target (t (u a)) (t (u b))
<-|-|- Jet t (t a)
xs

instance Traversable (->) (->) t => Traversable (->) (->) (Jet t) where
	a -> u b
f <-/- :: (a -> u b) -> Jet t a -> u (Jet t b)
<-/- Jet a
x Jet t (t a)
xs = b -> Jet t (t b) -> Jet t b
forall (t :: * -> *) a. a -> Jet t (t a) -> Jet t a
Jet (b -> Jet t (t b) -> Jet t b) -> u b -> u (Jet t (t b) -> Jet t b)
forall (source :: * -> * -> *) (target :: * -> * -> *)
       (t :: * -> *) a b.
Covariant source target t =>
source a b -> target (t a) (t b)
<-|-- a -> u b
f a
x u (Jet t (t b) -> Jet t b) -> u (Jet t (t b)) -> u (Jet t b)
forall (t :: * -> *) a b.
(Covariant (->) (->) t,
 Semimonoidal (Straight (->)) (:*:) (:*:) t) =>
t (a -> b) -> t a -> t b
<-*-- (a -> u b
f (a -> u b) -> Jet t (t a) -> u (Jet t (t b))
forall (t :: * -> *) (u :: * -> *) (v :: * -> *)
       (category :: * -> * -> *) a b.
(Traversable category category t, Covariant category category u,
 Monoidal (Straight category) (Straight category) (:*:) (:*:) u,
 Traversable category category v) =>
category a (u b) -> category (v (t a)) (u (v (t b)))
<-/-/- Jet t (t a)
xs)