{-# OPTIONS --without-K --rewriting #-}

open import lib.Basics
open import lib.wild-cats.WildCat

module lib.wild-cats.WildFunctor where

record Functor-wc {i₁ j₁ i₂ j₂} (B : WildCat {i₁} {j₁}) (C : WildCat {i₂} {j₂}) :
  Type (lmax (lmax i₁ j₁) (lmax i₂ j₂)) where
  constructor functor-wc
  field
    obj : ob B  ob C
    arr : {a b : ob B}  hom B a b  hom C (obj a) (obj b)
    id : (a : ob B)  arr (id₁ B a) == id₁ C (obj a)
    comp : {a b c : ob B} (f : hom B a b) (g : hom B b c)  arr ( B  g  f) ==  C  arr g  arr f
  comp-tri : {a b c d : ob B} (f : hom B a b) (g : hom B b c) (h : hom B c d)
     arr ( B  h   B  g  f) ==  C  arr h   C  arr g  arr f
  comp-tri f g h = comp ( B  g  f) h  ap  m   C  arr h  m) (comp f g)
open Functor-wc public

F-equiv-wc :  {i₁ j₁ i₂ j₂} {B : WildCat {i₁} {j₁}} {C : WildCat {i₂} {j₂}}
  (F : Functor-wc B C) {a b : ob B} {f : hom B a b}  equiv-wc B f  equiv-wc C (arr F f)
fst (F-equiv-wc F {f = f} (g , _)) = arr F g
fst (snd (F-equiv-wc F {a} {f = f} (g , li , _))) = ! (id F a)  ap (arr F) li  comp F f g 
snd (snd (F-equiv-wc F {b = b} {f} (g , _ , ri))) =  ! (id F b)  ap (arr F) ri  comp F g f

module _ {i j} (B : WildCat {i} {j}) where

  idfWC : Functor-wc B B
  obj idfWC = idf (ob B)
  arr idfWC = λ f  f
  id idfWC _ = idp
  comp idfWC _ _ = idp

module _ {i₁ i₂ i₃ j₁ j₂ j₃} {B : WildCat {i₁} {j₁}} {C : WildCat {i₂} {j₂}} {D : WildCat {i₃} {j₃}}  where

  infixr 60 _∘WC_
  _∘WC_ : (φ₂ : Functor-wc C D) (φ₁ : Functor-wc B C)  Functor-wc B D
  obj (φ₂ ∘WC φ₁) = obj φ₂  obj φ₁
  arr (φ₂ ∘WC φ₁) = arr φ₂  arr φ₁
  id (φ₂ ∘WC φ₁) x = ap (arr φ₂) (id φ₁ x)  id φ₂ (obj φ₁ x)
  comp (φ₂ ∘WC φ₁) f g = ap (arr φ₂) (comp φ₁ f g)  comp φ₂ (arr φ₁ f) (arr φ₁ g)