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

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

newtype Disc a = Disc a
    deriving stock (Int -> Disc a -> ShowS
[Disc a] -> ShowS
Disc a -> String
(Int -> Disc a -> ShowS)
-> (Disc a -> String) -> ([Disc a] -> ShowS) -> Show (Disc a)
forall a. Show a => Int -> Disc a -> ShowS
forall a. Show a => [Disc a] -> ShowS
forall a. Show a => Disc a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Disc a -> ShowS
showsPrec :: Int -> Disc a -> ShowS
$cshow :: forall a. Show a => Disc a -> String
show :: Disc a -> String
$cshowList :: forall a. Show a => [Disc a] -> ShowS
showList :: [Disc a] -> ShowS
Show, ReadPrec [Disc a]
ReadPrec (Disc a)
Int -> ReadS (Disc a)
ReadS [Disc a]
(Int -> ReadS (Disc a))
-> ReadS [Disc a]
-> ReadPrec (Disc a)
-> ReadPrec [Disc a]
-> Read (Disc a)
forall a. Read a => ReadPrec [Disc a]
forall a. Read a => ReadPrec (Disc a)
forall a. Read a => Int -> ReadS (Disc a)
forall a. Read a => ReadS [Disc a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: forall a. Read a => Int -> ReadS (Disc a)
readsPrec :: Int -> ReadS (Disc a)
$creadList :: forall a. Read a => ReadS [Disc a]
readList :: ReadS [Disc a]
$creadPrec :: forall a. Read a => ReadPrec (Disc a)
readPrec :: ReadPrec (Disc a)
$creadListPrec :: forall a. Read a => ReadPrec [Disc a]
readListPrec :: ReadPrec [Disc a]
Read)
    deriving newtype (Disc a -> Disc a -> Bool
(Disc a -> Disc a -> Bool)
-> (Disc a -> Disc a -> Bool) -> Eq (Disc a)
forall a. Eq a => Disc a -> Disc a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Disc a -> Disc a -> Bool
== :: Disc a -> Disc a -> Bool
$c/= :: forall a. Eq a => Disc a -> Disc a -> Bool
/= :: Disc a -> Disc a -> Bool
Eq, Eq (Disc a)
Eq (Disc a) =>
(Disc a -> Disc a -> Ordering)
-> (Disc a -> Disc a -> Bool)
-> (Disc a -> Disc a -> Bool)
-> (Disc a -> Disc a -> Bool)
-> (Disc a -> Disc a -> Bool)
-> (Disc a -> Disc a -> Disc a)
-> (Disc a -> Disc a -> Disc a)
-> Ord (Disc a)
Disc a -> Disc a -> Bool
Disc a -> Disc a -> Ordering
Disc a -> Disc a -> Disc 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 (Disc a)
forall a. Ord a => Disc a -> Disc a -> Bool
forall a. Ord a => Disc a -> Disc a -> Ordering
forall a. Ord a => Disc a -> Disc a -> Disc a
$ccompare :: forall a. Ord a => Disc a -> Disc a -> Ordering
compare :: Disc a -> Disc a -> Ordering
$c< :: forall a. Ord a => Disc a -> Disc a -> Bool
< :: Disc a -> Disc a -> Bool
$c<= :: forall a. Ord a => Disc a -> Disc a -> Bool
<= :: Disc a -> Disc a -> Bool
$c> :: forall a. Ord a => Disc a -> Disc a -> Bool
> :: Disc a -> Disc a -> Bool
$c>= :: forall a. Ord a => Disc a -> Disc a -> Bool
>= :: Disc a -> Disc a -> Bool
$cmax :: forall a. Ord a => Disc a -> Disc a -> Disc a
max :: Disc a -> Disc a -> Disc a
$cmin :: forall a. Ord a => Disc a -> Disc a -> Disc a
min :: Disc a -> Disc a -> Disc a
Ord, Int -> Disc a
Disc a -> Int
Disc a -> [Disc a]
Disc a -> Disc a
Disc a -> Disc a -> [Disc a]
Disc a -> Disc a -> Disc a -> [Disc a]
(Disc a -> Disc a)
-> (Disc a -> Disc a)
-> (Int -> Disc a)
-> (Disc a -> Int)
-> (Disc a -> [Disc a])
-> (Disc a -> Disc a -> [Disc a])
-> (Disc a -> Disc a -> [Disc a])
-> (Disc a -> Disc a -> Disc a -> [Disc a])
-> Enum (Disc a)
forall a. Enum a => Int -> Disc a
forall a. Enum a => Disc a -> Int
forall a. Enum a => Disc a -> [Disc a]
forall a. Enum a => Disc a -> Disc a
forall a. Enum a => Disc a -> Disc a -> [Disc a]
forall a. Enum a => Disc a -> Disc a -> Disc a -> [Disc a]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: forall a. Enum a => Disc a -> Disc a
succ :: Disc a -> Disc a
$cpred :: forall a. Enum a => Disc a -> Disc a
pred :: Disc a -> Disc a
$ctoEnum :: forall a. Enum a => Int -> Disc a
toEnum :: Int -> Disc a
$cfromEnum :: forall a. Enum a => Disc a -> Int
fromEnum :: Disc a -> Int
$cenumFrom :: forall a. Enum a => Disc a -> [Disc a]
enumFrom :: Disc a -> [Disc a]
$cenumFromThen :: forall a. Enum a => Disc a -> Disc a -> [Disc a]
enumFromThen :: Disc a -> Disc a -> [Disc a]
$cenumFromTo :: forall a. Enum a => Disc a -> Disc a -> [Disc a]
enumFromTo :: Disc a -> Disc a -> [Disc a]
$cenumFromThenTo :: forall a. Enum a => Disc a -> Disc a -> Disc a -> [Disc a]
enumFromThenTo :: Disc a -> Disc a -> Disc a -> [Disc a]
Enum, Disc a
Disc a -> Disc a -> Bounded (Disc a)
forall a. a -> a -> Bounded a
forall a. Bounded a => Disc a
$cminBound :: forall a. Bounded a => Disc a
minBound :: Disc a
$cmaxBound :: forall a. Bounded a => Disc a
maxBound :: Disc a
Bounded)

instance IQuiver a (Disc a) where
  src :: Disc a -> a
src (Disc a
x) = a
x
  tgt :: Disc a -> a
tgt (Disc a
x) = a
x

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