module GpdCont.TwoCategory.LaxFunctor where
open import GpdCont.Prelude
open import GpdCont.TwoCategory.Base
module _ {ℓo ℓo′ ℓh ℓh′ ℓr ℓr′}
  (C : TwoCategory ℓo ℓh ℓr)
  (D : TwoCategory ℓo′ ℓh′ ℓr′)
  where
    private
      ℓ = ℓ-max (ℓ-max ℓo (ℓ-max ℓh ℓr)) (ℓ-max ℓo′ (ℓ-max ℓh′ ℓr′))
      module C = TwoCategory C
      module D = TwoCategory D
    record LaxFunctor : Type ℓ where
      no-eta-equality
      field
        F-ob : C.ob → D.ob
        F-hom : {x y : C.ob} → C.hom x y → D.hom (F-ob x) (F-ob y)
        F-rel : {x y : C.ob} {f g : C.hom x y} → C.rel f g → D.rel (F-hom f) (F-hom g)
      ₀ = F-ob
      ₁ = F-hom
      ₂ = F-rel
      
      field
        F-rel-id : {x y : C.ob} {f : C.hom x y}
          → F-rel (C.id-rel f) ≡ D.id-rel (F-hom f)
        F-rel-trans : {x y : C.ob} {f g h : C.hom x y}
          → (r : C.rel f g)
          → (s : C.rel g h)
          → F-rel (r C.∙ᵥ s) ≡ (F-rel r) D.∙ᵥ (F-rel s)
      
      field
        
        F-trans-lax : {x y z : C.ob} (f : C.hom x y) (g : C.hom y z)
          → D.rel (F-hom f D.∙₁ F-hom g) (F-hom (f C.∙₁ g))
        F-trans-lax-natural : {x y z : C.ob} {f₁ f₂ : C.hom x y} {g₁ g₂ : C.hom y z}
          → (r : C.rel f₁ f₂)
          → (s : C.rel g₁ g₂)
          → (F-rel r D.∙ₕ F-rel s) D.∙ᵥ F-trans-lax f₂ g₂ ≡ F-trans-lax f₁ g₁ D.∙ᵥ F-rel (r C.∙ₕ s)
        
        
        F-id-lax : (x : C.ob) → D.rel (D.id-hom (F-ob x)) (F-hom (C.id-hom x))
      field
        F-assoc : {x y z w : C.ob} (f : C.hom x y) (g : C.hom y z) (h : C.hom z w)
          → PathP (λ i → D.rel (D.comp-hom-assoc (F-hom f) (F-hom g) (F-hom h) i) (F-hom (C.comp-hom-assoc f g h i)))
              ((F-trans-lax f g D.∙ₕ D.id-rel (F-hom h)) D.∙ᵥ F-trans-lax (f C.∙₁ g) h)
              ((D.id-rel (F-hom f) D.∙ₕ F-trans-lax g h) D.∙ᵥ F-trans-lax f (g C.∙₁ h))
        F-unit-left : {x y : C.ob} (f : C.hom x y)
          → PathP (λ i → D.rel (D.comp-hom-unit-left (F-hom f) i) (F-hom (C.comp-hom-unit-left f i)))
              ((F-id-lax x D.∙ₕ D.id-rel (F-hom f)) D.∙ᵥ F-trans-lax (C.id-hom x) f)
              (D.id-rel (F-hom f))
        F-unit-right : {x y : C.ob} (f : C.hom x y)
          → PathP (λ i → D.rel (D.comp-hom-unit-right (F-hom f) i) (F-hom (C.comp-hom-unit-right f i)))
              ((D.id-rel (F-hom f) D.∙ₕ F-id-lax y) D.∙ᵥ F-trans-lax f (C.id-hom y))
              (D.id-rel (F-hom f))