module Pandora.Pattern.Category (Category (..)) where

import Pandora.Pattern.Semigroupoid (Semigroupoid ((.)))

infixl 1 <---------
infixl 2 <--------
infixl 3 <-------
infixl 4 <------
infixl 5 <-----
infixl 6 <----
infixl 7 <---
infixl 8 <--

infixr 1 --------->
infixr 2 -------->
infixr 3 ------->
infixr 4 ------>
infixr 5 ----->
infixr 6 ---->
infixr 7 --->
infixr 8 -->

{- |
> When providing a new instance, you should ensure it satisfies:
> * Left identity: identity . f ≡ f
> * Right identity: f . identity ≡ f
-}

class Semigroupoid m => Category m where
	identity :: m a a

	(<---------), (<--------), (<-------), (<------), (<-----), (<----), (<---), (<--) :: m (m a b) (m a b)
	(<---------) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(<--------) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(<-------) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(<------) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(<-----) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(<----) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(<---) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(<--) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity

	(--------->), (-------->), (------->), (------>), (----->), (---->), (--->), (-->) :: m (m a b) (m a b)
	(--------->) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(-------->) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(------->) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(------>) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(----->) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(---->) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(--->) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity
	(-->) = m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity m (m a b) (m a b) -> m (m a b) (m a b) -> m (m a b) (m a b)
forall (m :: * -> * -> *) b c a.
Semigroupoid m =>
m b c -> m a b -> m a c
. m (m a b) (m a b)
forall (m :: * -> * -> *) a. Category m => m a a
identity