module Pandora.Paradigm.Schemes.TUT where import Pandora.Core.Functor (type (:.), type (:=), type (~>)) import Pandora.Pattern.Semigroupoid ((.)) import Pandora.Pattern.Category (identity, ($)) import Pandora.Pattern.Functor.Covariant (Covariant, Covariant ((-<$>-)), (-<$$>-), (-<$$$>-)) import Pandora.Pattern.Functor.Contravariant (Contravariant) import Pandora.Pattern.Functor.Semimonoidal (Semimonoidal (multiply_)) import Pandora.Pattern.Functor.Pointable (Pointable (point)) import Pandora.Pattern.Functor.Extractable (Extractable (extract)) import Pandora.Pattern.Functor.Extendable (Extendable ((<<=))) import Pandora.Pattern.Functor.Distributive (Distributive ((-<<))) import Pandora.Pattern.Functor.Adjoint (Adjoint ((-|), (|-))) import Pandora.Pattern.Transformer.Liftable (Liftable (lift)) import Pandora.Pattern.Transformer.Lowerable (Lowerable (lower)) import Pandora.Paradigm.Primary.Algebraic.Product ((:*:)((:*:))) import Pandora.Paradigm.Controlflow.Effect.Interpreted (Interpreted (Primary, run, unite)) newtype TUT ct ct' cu t t' u a = TUT (t :. u :. t' := a) infix 3 <:<.>:>, >:<.>:>, <:<.>:<, >:<.>:<, <:>.<:>, >:>.<:>, <:>.<:<, >:>.<:< type (<:<.>:>) = TUT Covariant Covariant Covariant type (>:<.>:>) = TUT Contravariant Covariant Covariant type (<:<.>:<) = TUT Covariant Covariant Contravariant type (>:<.>:<) = TUT Contravariant Covariant Contravariant type (<:>.<:>) = TUT Covariant Contravariant Covariant type (>:>.<:>) = TUT Contravariant Contravariant Covariant type (<:>.<:<) = TUT Covariant Contravariant Contravariant type (>:>.<:<) = TUT Contravariant Contravariant Contravariant instance Interpreted (TUT ct ct' cu t t' u) where type Primary (TUT ct ct' cu t t' u) a = t :. u :. t' := a run :: TUT ct ct' cu t t' u a -> Primary (TUT ct ct' cu t t' u) a run ~(TUT (t :. (u :. t')) := a x) = (t :. (u :. t')) := a Primary (TUT ct ct' cu t t' u) a x unite :: Primary (TUT ct ct' cu t t' u) a -> TUT ct ct' cu t t' u a unite = Primary (TUT ct ct' cu t t' u) a -> TUT ct ct' cu t t' u a forall k k k k k k (ct :: k) (ct' :: k) (cu :: k) (t :: k -> *) (t' :: k -> k) (u :: k -> k) (a :: k). ((t :. (u :. t')) := a) -> TUT ct ct' cu t t' u a TUT instance (Covariant t (->) (->), Covariant t' (->) (->), Covariant u (->) (->)) => Covariant (t <:<.>:> t' := u) (->) (->) where a -> b f -<$>- :: (a -> b) -> (:=) (t <:<.>:> t') u a -> (:=) (t <:<.>:> t') u b -<$>- TUT (t :. (u :. t')) := a x = ((t :. (u :. t')) := b) -> (:=) (t <:<.>:> t') u b forall k k k k k k (ct :: k) (ct' :: k) (cu :: k) (t :: k -> *) (t' :: k -> k) (u :: k -> k) (a :: k). ((t :. (u :. t')) := a) -> TUT ct ct' cu t t' u a TUT (((t :. (u :. t')) := b) -> (:=) (t <:<.>:> t') u b) -> ((t :. (u :. t')) := b) -> (:=) (t <:<.>:> t') u b forall (m :: * -> * -> *) a b. Category m => m (m a b) (m a b) $ a -> b f (a -> b) -> ((t :. (u :. t')) := a) -> (t :. (u :. t')) := b forall (t :: * -> *) (u :: * -> *) (v :: * -> *) (category :: * -> * -> *) a b. (Covariant t category category, Covariant u category category, Covariant v category category) => category a b -> category (t (u (v a))) (t (u (v b))) -<$$$>- (t :. (u :. t')) := a x instance (Covariant t (->) (->), Covariant t' (->) (->), Covariant u (->) (->), Semimonoidal t (->) (:*:) (:*:), Semimonoidal u (->) (:*:) (:*:), Semimonoidal t' (->) (:*:) (:*:)) => Semimonoidal (t <:<.>:> t' := u) (->) (:*:) (:*:) where multiply_ :: ((:=) (t <:<.>:> t') u a :*: (:=) (t <:<.>:> t') u b) -> (:=) (t <:<.>:> t') u (a :*: b) multiply_ (TUT (t :. (u :. t')) := a x :*: TUT (t :. (u :. t')) := b y) = ((t :. (u :. t')) := (a :*: b)) -> (:=) (t <:<.>:> t') u (a :*: b) forall k k k k k k (ct :: k) (ct' :: k) (cu :: k) (t :: k -> *) (t' :: k -> k) (u :: k -> k) (a :: k). ((t :. (u :. t')) := a) -> TUT ct ct' cu t t' u a TUT (((t :. (u :. t')) := (a :*: b)) -> (:=) (t <:<.>:> t') u (a :*: b)) -> ((t :. (u :. t')) := (a :*: b)) -> (:=) (t <:<.>:> t') u (a :*: b) forall (m :: * -> * -> *) a b. Category m => m (m a b) (m a b) $ forall k (t :: k -> *) (p :: * -> * -> *) (source :: * -> * -> *) (target :: k -> k -> k) (a :: k) (b :: k). Semimonoidal t p source target => p (source (t a) (t b)) (t (target a b)) forall (target :: * -> * -> *) a b. Semimonoidal t' (->) (:*:) target => (t' a :*: t' b) -> t' (target a b) multiply_ @_ @(->) @(:*:) ((t' a :*: t' b) -> t' (a :*: b)) -> ((u (t' a) :*: u (t' b)) -> u (t' a :*: t' b)) -> (u (t' a) :*: u (t' b)) -> u (t' (a :*: b)) forall (t :: * -> *) (u :: * -> *) (category :: * -> * -> *) a b. (Covariant u category category, Covariant t category category) => category a b -> category (t (u a)) (t (u b)) -<$$>- forall k (t :: k -> *) (p :: * -> * -> *) (source :: * -> * -> *) (target :: k -> k -> k) (a :: k) (b :: k). Semimonoidal t p source target => p (source (t a) (t b)) (t (target a b)) forall (target :: * -> * -> *) a b. Semimonoidal u (->) (:*:) target => (u a :*: u b) -> u (target a b) multiply_ @_ @(->) @(:*:) ((u (t' a) :*: u (t' b)) -> u (t' (a :*: b))) -> t (u (t' a) :*: u (t' b)) -> (t :. (u :. t')) := (a :*: b) forall (t :: * -> *) (source :: * -> * -> *) (target :: * -> * -> *) a b. Covariant t source target => source a b -> target (t a) (t b) -<$>- (((t :. (u :. t')) := a) :*: ((t :. (u :. t')) := b)) -> t (u (t' a) :*: u (t' b)) forall k (t :: k -> *) (p :: * -> * -> *) (source :: * -> * -> *) (target :: k -> k -> k) (a :: k) (b :: k). Semimonoidal t p source target => p (source (t a) (t b)) (t (target a b)) multiply_ ((t :. (u :. t')) := a x ((t :. (u :. t')) := a) -> ((t :. (u :. t')) := b) -> ((t :. (u :. t')) := a) :*: ((t :. (u :. t')) := b) forall s a. s -> a -> s :*: a :*: (t :. (u :. t')) := b y) instance (Covariant t (->) (->), Covariant t' (->) (->), Pointable u (->), Adjoint t' t (->) (->)) => Pointable (t <:<.>:> t' := u) (->) where point :: a -> (:=) (t <:<.>:> t') u a point = ((t :. (u :. t')) := a) -> (:=) (t <:<.>:> t') u a forall (t :: * -> *) a. Interpreted t => Primary t a -> t a unite (((t :. (u :. t')) := a) -> (:=) (t <:<.>:> t') u a) -> (a -> (t :. (u :. t')) := a) -> a -> (:=) (t <:<.>:> t') u a forall (m :: * -> * -> *) b c a. Semigroupoid m => m b c -> m a b -> m a c . (forall a. Pointable u (->) => a -> u a forall (t :: * -> *) (source :: * -> * -> *) a. Pointable t source => source a (t a) point @_ @(->) (t' a -> u (t' a)) -> a -> (t :. (u :. t')) := a forall (t :: * -> *) (u :: * -> *) (source :: * -> * -> *) (target :: * -> * -> *) a b. Adjoint t u source target => source (t a) b -> target a (u b) -|) instance (Adjoint t' t (->) (->), Extendable u (->)) => Extendable (t' <:<.>:> t := u) (->) where (:=) (t' <:<.>:> t) u a -> b f <<= :: ((:=) (t' <:<.>:> t) u a -> b) -> (:=) (t' <:<.>:> t) u a -> (:=) (t' <:<.>:> t) u b <<= (:=) (t' <:<.>:> t) u a x = ((t' :. (u :. t)) := b) -> (:=) (t' <:<.>:> t) u b forall k k k k k k (ct :: k) (ct' :: k) (cu :: k) (t :: k -> *) (t' :: k -> k) (u :: k -> k) (a :: k). ((t :. (u :. t')) := a) -> TUT ct ct' cu t t' u a TUT (((t' :. (u :. t)) := b) -> (:=) (t' <:<.>:> t) u b) -> ((t' :. (u :. t)) := b) -> (:=) (t' <:<.>:> t) u b forall (m :: * -> * -> *) a b. Category m => m (m a b) (m a b) $ (((:=) (t' <:<.>:> t) u a -> b f ((:=) (t' <:<.>:> t) u a -> b) -> (t' (u (t a)) -> (:=) (t' <:<.>:> t) u a) -> t' (u (t a)) -> b forall (m :: * -> * -> *) b c a. Semigroupoid m => m b c -> m a b -> m a c . t' (u (t a)) -> (:=) (t' <:<.>:> t) u a forall (t :: * -> *) a. Interpreted t => Primary t a -> t a unite (t' (u (t a)) -> b) -> u (t a) -> t b forall (t :: * -> *) (u :: * -> *) (source :: * -> * -> *) (target :: * -> * -> *) a b. Adjoint t u source target => source (t a) b -> target a (u b) -|) (u (t a) -> t b) -> u (t a) -> u (t b) forall (t :: * -> *) (source :: * -> * -> *) a b. Extendable t source => source (t a) b -> source (t a) (t b) <<=) (u (t a) -> u (t b)) -> t' (u (t a)) -> (t' :. (u :. t)) := b forall (t :: * -> *) (source :: * -> * -> *) (target :: * -> * -> *) a b. Covariant t source target => source a b -> target (t a) (t b) -<$>- (:=) (t' <:<.>:> t) u a -> Primary ((t' <:<.>:> t) := u) a forall (t :: * -> *) a. Interpreted t => t a -> Primary t a run (:=) (t' <:<.>:> t) u a x instance (Covariant t (->) (->), Covariant t' (->) (->), Adjoint t t' (->) (->), Extractable u (->)) => Extractable (t <:<.>:> t' := u) (->) where extract :: (:=) (t <:<.>:> t') u a -> a extract = (forall a. Extractable u (->) => u a -> a forall (t :: * -> *) (source :: * -> * -> *) a. Extractable t source => source (t a) a extract @_ @(->) (u (t' a) -> t' a) -> t (u (t' a)) -> a forall (t :: * -> *) (u :: * -> *) (source :: * -> * -> *) (target :: * -> * -> *) a b. Adjoint t u source target => target a (u b) -> source (t a) b |-) (t (u (t' a)) -> a) -> ((:=) (t <:<.>:> t') u a -> t (u (t' a))) -> (:=) (t <:<.>:> t') u a -> a forall (m :: * -> * -> *) b c a. Semigroupoid m => m b c -> m a b -> m a c . (:=) (t <:<.>:> t') u a -> t (u (t' a)) forall (t :: * -> *) a. Interpreted t => t a -> Primary t a run instance (Adjoint t' t (->) (->), Distributive t(->) (->) ) => Liftable (t <:<.>:> t') where lift :: Covariant u (->) (->) => u ~> t <:<.>:> t' := u lift :: u ~> ((t <:<.>:> t') := u) lift u a x = ((t :. (u :. t')) := a) -> TUT Covariant Covariant Covariant t t' u a forall k k k k k k (ct :: k) (ct' :: k) (cu :: k) (t :: k -> *) (t' :: k -> k) (u :: k -> k) (a :: k). ((t :. (u :. t')) := a) -> TUT ct ct' cu t t' u a TUT (((t :. (u :. t')) := a) -> TUT Covariant Covariant Covariant t t' u a) -> ((t :. (u :. t')) := a) -> TUT Covariant Covariant Covariant t t' u a forall (m :: * -> * -> *) a b. Category m => m (m a b) (m a b) $ (forall a. Category (->) => a -> a forall (m :: * -> * -> *) a. Category m => m a a identity @(->) (t' a -> t' a) -> a -> t (t' a) forall (t :: * -> *) (u :: * -> *) (source :: * -> * -> *) (target :: * -> * -> *) a b. Adjoint t u source target => source (t a) b -> target a (u b) -|) (a -> t (t' a)) -> u a -> (t :. (u :. t')) := a forall (t :: * -> *) (source :: * -> * -> *) (target :: * -> * -> *) (u :: * -> *) a b. (Distributive t source target, Covariant u source target) => source a (t b) -> target (u a) (t (u b)) -<< u a x instance (Adjoint t t' (->) (->), Distributive t'(->) (->) ) => Lowerable (t <:<.>:> t') where lower :: Covariant u (->) (->) => (t <:<.>:> t' := u) ~> u lower :: ((t <:<.>:> t') := u) ~> u lower (TUT (t :. (u :. t')) := a x) = (forall a. Category (->) => a -> a forall (m :: * -> * -> *) a. Category m => m a a identity @(->) (t' a -> t' a) -> u (t' a) -> t' (u a) forall (t :: * -> *) (source :: * -> * -> *) (target :: * -> * -> *) (u :: * -> *) a b. (Distributive t source target, Covariant u source target) => source a (t b) -> target (u a) (t (u b)) -<<) (u (t' a) -> t' (u a)) -> ((t :. (u :. t')) := a) -> u a forall (t :: * -> *) (u :: * -> *) (source :: * -> * -> *) (target :: * -> * -> *) a b. Adjoint t u source target => target a (u b) -> source (t a) b |- (t :. (u :. t')) := a x