{-# OPTIONS --safe #-} open import Cubical.Foundations.Prelude open import Cubical.Foundations.Equiv open import Cubical.Foundations.Function open import Cubical.Foundations.HLevels open import Cubical.Data.Sigma open import Cubical.Categories.Category open import Cubical.Categories.Displayed.Base open import Cubical.Categories.Displayed.Cartesian module Cubical.Categories.Displayed.Instances.Codomain {ℓC ℓ'C : Level} (C : Category ℓC ℓ'C) where private module C = Category C module _ where open Categoryᴰ codomainᴰ : Categoryᴰ C (ℓ-max ℓC ℓ'C) ℓ'C codomainᴰ .ob[_] c = Σ[ d ∈ C.ob ] C.Hom[ d , c ] codomainᴰ .Hom[_][_,_] f (d , g) (e , h) = Σ[ fᴰ ∈ C.Hom[ d , e ] ] fᴰ C.⋆ h ≡ g C.⋆ f codomainᴰ .idᴰ = (C.id , C.⋆IdL _ ∙ sym (C.⋆IdR _)) codomainᴰ ._⋆ᴰ_ (fᴰ , fᴰ-comm) (gᴰ , gᴰ-comm) = fᴰ C.⋆ gᴰ , C.⋆Assoc _ _ _ ∙ cong (fᴰ C.⋆_) gᴰ-comm ∙ sym (C.⋆Assoc _ _ _) ∙ cong (C._⋆ _) fᴰ-comm ∙ C.⋆Assoc _ _ _ codomainᴰ .⋆IdLᴰ (fᴰ , _) = ΣPathPProp (λ _ → C.isSetHom _ _) (C.⋆IdL fᴰ) codomainᴰ .⋆IdRᴰ (fᴰ , _) = ΣPathPProp (λ _ → C.isSetHom _ _) (C.⋆IdR fᴰ) codomainᴰ .⋆Assocᴰ (fᴰ , _) (gᴰ , _) (hᴰ , _) = ΣPathPProp (λ _ → C.isSetHom _ _) (C.⋆Assoc fᴰ gᴰ hᴰ) codomainᴰ .isSetHomᴰ = isSetΣSndProp C.isSetHom (λ _ → C.isSetHom _ _) open Covariant codomainOpcleavage : Opcleavage codomainᴰ codomainOpcleavage f (dᴰ , dᴰ→d) .fst = dᴰ , dᴰ→d C.⋆ f codomainOpcleavage _ _ .snd .fst = C.id , C.⋆IdL _ codomainOpcleavage _ _ .snd .snd _ .equiv-proof (gᴰ , gᴰ-commutes) .fst = (gᴰ , gᴰ-commutes ∙ sym (C.⋆Assoc _ _ _)) , Σ≡Prop (λ _ → C.isSetHom _ _) (C.⋆IdL _) codomainOpcleavage _ _ .snd .snd _ .equiv-proof _ .snd (_ , infib) = Σ≡Prop (λ _ → isSetΣSndProp C.isSetHom (λ _ → C.isSetHom _ _) _ _) $ Σ≡Prop (λ _ → C.isSetHom _ _) $ sym (cong fst infib) ∙ C.⋆IdL _