{-# LANGUAGE UndecidableInstances #-} module Pandora.Paradigm.Primary.Transformer.Jet where import Pandora.Pattern.Functor.Covariant (Covariant ((-<$>-)), (-<$$>-)) import Pandora.Pattern.Functor.Traversable (Traversable ((<<-)), (-<<-<<-)) import Pandora.Paradigm.Primary.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 (a -> b f a x) (a -> b f (a -> b) -> Jet t (t a) -> Jet t (t b) forall (t :: * -> *) (u :: * -> *) (category :: * -> * -> *) a b. (Covariant category category u, Covariant category category t) => category a b -> category (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 (->) (:*:) (:*:) 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 category category (:*:) (:*:) u, Traversable category category v) => category a (u b) -> category (v (t a)) (u (v (t b))) -<<-<<- Jet t (t a) xs