{-# LANGUAGE DerivingStrategies #-}
module Data.InternalCategory.Codiscrete where

import Data.InternalCategory
    ( IQuiver(..), ICategory(..), Path(Path) )

data Codisc a = Codisc a a
    deriving stock (Codisc a -> Codisc a -> Bool
(Codisc a -> Codisc a -> Bool)
-> (Codisc a -> Codisc a -> Bool) -> Eq (Codisc a)
forall a. Eq a => Codisc a -> Codisc a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Codisc a -> Codisc a -> Bool
== :: Codisc a -> Codisc a -> Bool
$c/= :: forall a. Eq a => Codisc a -> Codisc a -> Bool
/= :: Codisc a -> Codisc a -> Bool
Eq, Eq (Codisc a)
Eq (Codisc a) =>
(Codisc a -> Codisc a -> Ordering)
-> (Codisc a -> Codisc a -> Bool)
-> (Codisc a -> Codisc a -> Bool)
-> (Codisc a -> Codisc a -> Bool)
-> (Codisc a -> Codisc a -> Bool)
-> (Codisc a -> Codisc a -> Codisc a)
-> (Codisc a -> Codisc a -> Codisc a)
-> Ord (Codisc a)
Codisc a -> Codisc a -> Bool
Codisc a -> Codisc a -> Ordering
Codisc a -> Codisc a -> Codisc a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Codisc a)
forall a. Ord a => Codisc a -> Codisc a -> Bool
forall a. Ord a => Codisc a -> Codisc a -> Ordering
forall a. Ord a => Codisc a -> Codisc a -> Codisc a
$ccompare :: forall a. Ord a => Codisc a -> Codisc a -> Ordering
compare :: Codisc a -> Codisc a -> Ordering
$c< :: forall a. Ord a => Codisc a -> Codisc a -> Bool
< :: Codisc a -> Codisc a -> Bool
$c<= :: forall a. Ord a => Codisc a -> Codisc a -> Bool
<= :: Codisc a -> Codisc a -> Bool
$c> :: forall a. Ord a => Codisc a -> Codisc a -> Bool
> :: Codisc a -> Codisc a -> Bool
$c>= :: forall a. Ord a => Codisc a -> Codisc a -> Bool
>= :: Codisc a -> Codisc a -> Bool
$cmax :: forall a. Ord a => Codisc a -> Codisc a -> Codisc a
max :: Codisc a -> Codisc a -> Codisc a
$cmin :: forall a. Ord a => Codisc a -> Codisc a -> Codisc a
min :: Codisc a -> Codisc a -> Codisc a
Ord, Int -> Codisc a -> ShowS
[Codisc a] -> ShowS
Codisc a -> String
(Int -> Codisc a -> ShowS)
-> (Codisc a -> String) -> ([Codisc a] -> ShowS) -> Show (Codisc a)
forall a. Show a => Int -> Codisc a -> ShowS
forall a. Show a => [Codisc a] -> ShowS
forall a. Show a => Codisc a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Codisc a -> ShowS
showsPrec :: Int -> Codisc a -> ShowS
$cshow :: forall a. Show a => Codisc a -> String
show :: Codisc a -> String
$cshowList :: forall a. Show a => [Codisc a] -> ShowS
showList :: [Codisc a] -> ShowS
Show, ReadPrec [Codisc a]
ReadPrec (Codisc a)
Int -> ReadS (Codisc a)
ReadS [Codisc a]
(Int -> ReadS (Codisc a))
-> ReadS [Codisc a]
-> ReadPrec (Codisc a)
-> ReadPrec [Codisc a]
-> Read (Codisc a)
forall a. Read a => ReadPrec [Codisc a]
forall a. Read a => ReadPrec (Codisc a)
forall a. Read a => Int -> ReadS (Codisc a)
forall a. Read a => ReadS [Codisc a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: forall a. Read a => Int -> ReadS (Codisc a)
readsPrec :: Int -> ReadS (Codisc a)
$creadList :: forall a. Read a => ReadS [Codisc a]
readList :: ReadS [Codisc a]
$creadPrec :: forall a. Read a => ReadPrec (Codisc a)
readPrec :: ReadPrec (Codisc a)
$creadListPrec :: forall a. Read a => ReadPrec [Codisc a]
readListPrec :: ReadPrec [Codisc a]
Read)

instance IQuiver a (Codisc a) where
  src :: Codisc a -> a
src (Codisc a
x a
_) = a
x
  tgt :: Codisc a -> a
tgt (Codisc a
_ a
y) = a
y

instance Eq a => ICategory a (Codisc a) where
  foldPath :: Path a (Codisc a) -> Codisc a
foldPath (Path a
x [Codisc a]
_ a
y) = a -> a -> Codisc a
forall a. a -> a -> Codisc a
Codisc a
x a
y