{-# OPTIONS --without-K --safe #-}
module Cats.Category.Base where
open import Level
open import Relation.Binary using
(Rel ; IsEquivalence ; _Preserves_⟶_ ; _Preserves₂_⟶_⟶_ ; Setoid)
open import Relation.Binary.EqReasoning as EqReasoning
import Cats.Util.SetoidReasoning as SetoidR
record Category lo la l≈ : Set (suc (lo ⊔ la ⊔ l≈)) where
infixr 9 _∘_
infixl 9 _∙_
infix 4 _≈_
infixr -1 _⇒_
field
Obj : Set lo
_⇒_ : Obj → Obj → Set la
_≈_ : ∀ {A B} → Rel (A ⇒ B) l≈
id : {O : Obj} → O ⇒ O
_∘_ : ∀ {A B C} → B ⇒ C → A ⇒ B → A ⇒ C
equiv : ∀ {A B} → IsEquivalence (_≈_ {A} {B})
∘-resp : ∀ {A B C} → (_∘_ {A} {B} {C}) Preserves₂ _≈_ ⟶ _≈_ ⟶ _≈_
id-r : ∀ {A B} {f : A ⇒ B} → f ∘ id ≈ f
id-l : ∀ {A B} {f : A ⇒ B} → id ∘ f ≈ f
assoc : ∀ {A B C D} {f : C ⇒ D} {g : B ⇒ C} {h : A ⇒ B}
→ (f ∘ g) ∘ h ≈ f ∘ (g ∘ h)
_∙_ : ∀ {A B C} → A ⇒ B → B ⇒ C → A ⇒ C
f ∙ g = g ∘ f
Hom′ : (A B : Obj) → Set la
Hom′ A B = A ⇒ B
Hom : (A B : Obj) → Setoid la l≈
Hom A B = record
{ Carrier = A ⇒ B
; _≈_ = _≈_
; isEquivalence = equiv
}
module ≈ {A B} = IsEquivalence (equiv {A} {B})
module ≈-Reasoning {A B} where
open EqReasoning (Hom A B) public
triangle = SetoidR.triangle (Hom A B)
unassoc : ∀ {A B C D} {f : C ⇒ D} {g : B ⇒ C} {h : A ⇒ B}
→ f ∘ (g ∘ h) ≈ (f ∘ g) ∘ h
unassoc = ≈.sym assoc
∘-resp-r : ∀ {A B C} {f : B ⇒ C} → (_∘_ {A} f) Preserves _≈_ ⟶ _≈_
∘-resp-r eq = ∘-resp ≈.refl eq
∘-resp-l : ∀ {A B C} {g : A ⇒ B} → (λ f → _∘_ {C = C} f g) Preserves _≈_ ⟶ _≈_
∘-resp-l eq = ∘-resp eq ≈.refl