{-# OPTIONS --without-K #-} module Model.Product where open import Cats.Category open import Data.Product using (<_,_>) open import Model.Type.Core open import Util.HoTT.HLevel open import Util.Prelude hiding (_×_) infixr 5 _×_ _×_ : ∀ {Γ} (T U : ⟦Type⟧ Γ) → ⟦Type⟧ Γ T × U = record { ObjHSet = λ δ → T .ObjHSet δ ×-HSet U .ObjHSet δ ; eqHProp = λ where γ≈γ′ (x , x′) (y , y′) → T .eqHProp γ≈γ′ x y ×-HProp U .eqHProp γ≈γ′ x′ y′ ; eq-refl = λ where (x , y) → T .eq-refl x , U .eq-refl y } π₁ : ∀ {Γ} {T} (U : ⟦Type⟧ Γ) → T × U ⇒ T π₁ U = record { fobj = proj₁ ; feq = λ p → proj₁ } π₂ : ∀ {Γ} T {U : ⟦Type⟧ Γ} → T × U ⇒ U π₂ T = record { fobj = proj₂ ; feq = λ p → proj₂ } ⟨_,_⟩ : ∀ {Γ} {X T U : ⟦Type⟧ Γ} → X ⇒ T → X ⇒ U → X ⇒ T × U ⟨ f , g ⟩ = record { fobj = < f .fobj , g .fobj > ; feq = λ γ≈γ′ → < f .feq γ≈γ′ , g .feq γ≈γ′ > } instance hasBinaryProducts : ∀ {Γ} → HasBinaryProducts (⟦Types⟧ Γ) hasBinaryProducts .HasBinaryProducts._×′_ T U = record { prod = T × U ; proj = λ where true → π₁ U false → π₂ T ; isProduct = λ π′ → record { arr = ⟨ π′ true , π′ false ⟩ ; prop = λ where true → ≈⁺ λ γ x → refl false → ≈⁺ λ γ x → refl ; unique = λ {f} f-prop → ≈⁺ λ γ x → cong₂ _,_ (f-prop true .≈⁻ γ x) (f-prop false .≈⁻ γ x) } } open module ⟦Types⟧× {Γ} = HasBinaryProducts (hasBinaryProducts {Γ}) public using ( ⟨_×_⟩ ) renaming ( ×-resp-≅ to ×-resp-≈⟦Type⟧ )