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.Primary.Algebraic.Exponential ()
import Pandora.Paradigm.Primary.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.
Monoidal (->) (->) (:*:) (:*:) 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.
Monoidal (->) (->) (:*:) (:*:) 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