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