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