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