module Pandora.Paradigm.Primary.Functor.Wedge where import Pandora.Pattern.Category ((<--)) import Pandora.Pattern.Functor.Covariant (Covariant ((<-|-))) import Pandora.Pattern.Functor.Traversable (Traversable ((<-/-))) import Pandora.Paradigm.Algebraic.Exponential () import Pandora.Paradigm.Algebraic (point) data Wedge e a = Nowhere | Here e | There a instance Covariant (->) (->) (Wedge e) where a -> b _ <-|- :: (a -> b) -> Wedge e a -> Wedge e b <-|- Wedge e a Nowhere = Wedge e b forall e a. Wedge e a Nowhere a -> b _ <-|- Here e x = e -> Wedge e b forall e a. e -> Wedge e a Here e x a -> b f <-|- There a x = b -> Wedge e b forall e a. a -> Wedge e a There (b -> Wedge e b) -> b -> Wedge e b forall (m :: * -> * -> *) a b. Category m => m (m a b) (m a b) <-- a -> b f a x instance Traversable (->) (->) (Wedge e) where a -> u b _ <-/- :: (a -> u b) -> Wedge e a -> u (Wedge e b) <-/- Wedge e a Nowhere = Wedge e b -> u (Wedge e b) forall (t :: * -> *) a. Pointable t => a -> t a point Wedge e b forall e a. Wedge e a Nowhere a -> u b _ <-/- Here e x = Wedge e b -> u (Wedge e b) forall (t :: * -> *) a. Pointable t => a -> t a point (Wedge e b -> u (Wedge e b)) -> Wedge e b -> u (Wedge e b) forall (m :: * -> * -> *) a b. Category m => m (m a b) (m a b) <-- e -> Wedge e b forall e a. e -> Wedge e a Here e x a -> u b f <-/- There a x = b -> Wedge e b forall e a. a -> Wedge e a There (b -> Wedge e b) -> u b -> u (Wedge e 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 wedge :: (e -> r) -> (a -> r) -> r -> Wedge e a -> r wedge :: (e -> r) -> (a -> r) -> r -> Wedge e a -> r wedge e -> r f a -> r _ r _ (Here e x) = e -> r f e x wedge e -> r _ a -> r g r _ (There a x) = a -> r g a x wedge e -> r _ a -> r _ r r Wedge e a Nowhere = r r