{-# 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)