module Pandora.Paradigm.Primary.Functor.Wedge where

import Pandora.Pattern.Category (($))
import Pandora.Pattern.Functor.Covariant (Covariant ((<$>)), Covariant_ ((-<$>-)))
import Pandora.Pattern.Functor.Pointable (Pointable (point), Pointable_ (point_))
import Pandora.Pattern.Functor.Traversable (Traversable ((->>)))
import Pandora.Paradigm.Primary.Functor.Function ()

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 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 Pointable (Wedge e) (->) where
	point :: a -> Wedge e a
point = a -> Wedge e a
forall e a. a -> Wedge e a
There

instance Pointable_ (Wedge e) (->) where
	point_ :: a -> Wedge e a
point_ = a -> Wedge e a
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 :. Wedge e) := b
forall (t :: * -> *) (source :: * -> * -> *) a.
Pointable t source =>
source a (t a)
point Wedge e b
forall e a. Wedge e a
Nowhere
	Here e
x ->> a -> u b
_ = Wedge e b -> (u :. Wedge e) := b
forall (t :: * -> *) (source :: * -> * -> *) a.
Pointable t source =>
source 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
	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