{-# OPTIONS --without-K --safe #-} open import Categories.Category.Core using (Category) open import Level using (Level) module Category.Cocomplete.Finitely.Product {o β„“ e : Level} {π’ž π’Ÿ : Category o β„“ e} where open import Categories.Category using (_[_,_]) open import Categories.Category.Cocomplete.Finitely using (FinitelyCocomplete) open import Categories.Category.Cocartesian using (Cocartesian; BinaryCoproducts) open import Categories.Category.Product using (Product) open import Categories.Diagram.Coequalizer using (Coequalizer) open import Categories.Object.Coproduct using (Coproduct) open import Categories.Object.Initial using (IsInitial; Initial) open import Data.Product.Base using (_,_; _Γ—_; dmap; zip; map) Initial-Γ— : Initial π’ž β†’ Initial π’Ÿ β†’ Initial (Product π’žΒ π’Ÿ) Initial-Γ— initial-π’ž initial-π’Ÿ = record { βŠ₯ = π’ž.βŠ₯ , π’Ÿ.βŠ₯ ; βŠ₯-is-initial = record { ! = π’ž.! , π’Ÿ.! ; !-unique = dmap π’ž.!-unique π’Ÿ.!-unique } } where module π’ž = Initial initial-π’ž module π’Ÿ = Initial initial-π’Ÿ Coproducts-Γ— : BinaryCoproducts π’ž β†’ BinaryCoproducts π’Ÿ β†’ BinaryCoproducts (Product π’ž π’Ÿ) Coproducts-Γ— coproducts-π’ž coproducts-π’Ÿ = record { coproduct = coproduct } where coproduct : βˆ€ {(A₁ , B₁) (Aβ‚‚ , Bβ‚‚) : _ Γ— _} β†’ Coproduct (Product π’ž π’Ÿ) (A₁ , B₁) (Aβ‚‚ , Bβ‚‚) coproduct = record { A+B = π’ž.A+B , π’Ÿ.A+B ; i₁ = π’ž.i₁ , π’Ÿ.i₁ ; iβ‚‚ = π’ž.iβ‚‚ , π’Ÿ.iβ‚‚ ; [_,_] = zip π’ž.[_,_] π’Ÿ.[_,_] ; inject₁ = π’ž.inject₁ , π’Ÿ.inject₁ ; injectβ‚‚ = π’ž.injectβ‚‚ , π’Ÿ.injectβ‚‚ ; unique = zip π’ž.unique π’Ÿ.unique } where module Coprod {π’ž} (coprods : BinaryCoproducts π’ž) where open BinaryCoproducts coprods using (coproduct) open coproduct public module π’ž = Coprod coproducts-π’ž module π’Ÿ = Coprod coproducts-π’Ÿ Coequalizer-Γ— : (βˆ€ {A} {B} (f g : π’ž [ A , B ]) β†’ Coequalizer π’ž f g) β†’ (βˆ€ {A} {B} (f g : π’Ÿ [ A , B ]) β†’ Coequalizer π’Ÿ f g) β†’ βˆ€ {A} {B} {C} {D} ((f₁ , g₁) (fβ‚‚ , gβ‚‚) : π’ž [ A , B ] Γ— π’Ÿ [ C , D ]) β†’ Coequalizer (Product π’ž π’Ÿ) (f₁ , g₁) (fβ‚‚ , gβ‚‚) Coequalizer-Γ— coequalizer-π’ž coequalizer-π’Ÿ (f₁ , g₁) (fβ‚‚ , gβ‚‚) = record { arr = π’ž.arr , π’Ÿ.arr ; isCoequalizer = record { equality = π’ž.equality , π’Ÿ.equality ; coequalize = map π’ž.coequalize π’Ÿ.coequalize ; universal = π’ž.universal , π’Ÿ.universal ; unique = map π’ž.unique π’Ÿ.unique } } where module π’ž = Coequalizer (coequalizer-π’ž f₁ fβ‚‚) module π’Ÿ = Coequalizer (coequalizer-π’Ÿ g₁ gβ‚‚) Cocartesian-Γ— : Cocartesian π’ž β†’ Cocartesian π’Ÿ β†’ Cocartesian (Product π’ž π’Ÿ) Cocartesian-Γ— cocartesian-π’ž cocartesian-π’Ÿ = record { initial = Initial-Γ— π’ž.initial π’Ÿ.initial ; coproducts = Coproducts-Γ— π’ž.coproducts π’Ÿ.coproducts } where module π’ž = Cocartesian cocartesian-π’ž module π’Ÿ = Cocartesian cocartesian-π’Ÿ FinitelyCocomplete-Γ— : FinitelyCocomplete π’ž β†’ FinitelyCocomplete π’Ÿ β†’ FinitelyCocomplete (Product π’ž π’Ÿ) FinitelyCocomplete-Γ— finitelyCocomplete-π’ž finitelyCocomplete-π’Ÿ = record { cocartesian = Cocartesian-Γ— π’ž.cocartesian π’Ÿ.cocartesian ; coequalizer = Coequalizer-Γ— π’ž.coequalizer π’Ÿ.coequalizer } where module π’ž = FinitelyCocomplete finitelyCocomplete-π’ž module π’Ÿ = FinitelyCocomplete finitelyCocomplete-π’Ÿ