module Pandora.Paradigm.Primary.Functor.Edges where import Pandora.Pattern.Category (($)) import Pandora.Pattern.Functor.Covariant (Covariant ((<$>))) import Pandora.Pattern.Functor.Pointable (Pointable (point)) import Pandora.Pattern.Functor.Traversable (Traversable ((->>))) import Pandora.Paradigm.Primary.Functor.Function () data Edges a = Empty | Leap a | Connect a | Overlay a instance Covariant Edges where a -> b _ <$> :: (a -> b) -> Edges a -> Edges b <$> Edges a Empty = Edges b forall a. Edges a Empty a -> b f <$> Connect a x = b -> Edges b forall a. a -> Edges a Connect (b -> Edges b) -> b -> Edges b forall (m :: * -> * -> *). Category m => m ~~> m $ a -> b f a x a -> b f <$> Overlay a x = b -> Edges b forall a. a -> Edges a Overlay (b -> Edges b) -> b -> Edges b forall (m :: * -> * -> *). Category m => m ~~> m $ a -> b f a x a -> b f <$> Leap a x = b -> Edges b forall a. a -> Edges a Leap (b -> Edges b) -> b -> Edges b forall (m :: * -> * -> *). Category m => m ~~> m $ a -> b f a x instance Traversable Edges where Edges a Empty ->> :: Edges a -> (a -> u b) -> (u :. Edges) := b ->> a -> u b _ = Edges b :=> u forall (t :: * -> *) a. Pointable t => a :=> t point Edges b forall a. Edges a Empty Connect a x ->> a -> u b f = b -> Edges b forall a. a -> Edges a Connect (b -> Edges b) -> u b -> (u :. Edges) := b forall (t :: * -> *) a b. Covariant t => (a -> b) -> t a -> t b <$> a -> u b f a x Overlay a x ->> a -> u b f = b -> Edges b forall a. a -> Edges a Overlay (b -> Edges b) -> u b -> (u :. Edges) := b forall (t :: * -> *) a b. Covariant t => (a -> b) -> t a -> t b <$> a -> u b f a x Leap a x ->> a -> u b f = b -> Edges b forall a. a -> Edges a Leap (b -> Edges b) -> u b -> (u :. Edges) := b forall (t :: * -> *) a b. Covariant t => (a -> b) -> t a -> t b <$> a -> u b f a x edges :: r -> (a -> r) -> (a -> r) -> (a -> r) -> Edges a -> r edges :: r -> (a -> r) -> (a -> r) -> (a -> r) -> Edges a -> r edges r r a -> r _ a -> r _ a -> r _ Edges a Empty = r r edges r _ a -> r f a -> r _ a -> r _ (Connect a x) = a -> r f a x edges r _ a -> r _ a -> r g a -> r _ (Overlay a y) = a -> r g a y edges r _ a -> r _ a -> r _ a -> r h (Leap a z) = a -> r h a z