{-# OPTIONS --without-K --safe #-}
open import Categories.Bicategory using (Bicategory)

module Categories.Bicategory.Object.Product {o ā„“ e t} (š’ž : Bicategory o ā„“ e t) where

open import Level

open Bicategory š’ž
open import Categories.Category using (_[_,_])
open import Categories.Morphism using (_≅_)
open import Categories.Morphism.HeterogeneousEquality
open import Categories.Morphism.Notation using (_[_≅_])

record Product  (A B : Obj) : Set (o āŠ” ā„“ āŠ” e āŠ” t) where
  infix 10 ⟨_,_āŸ©ā‚ ⟨_,_āŸ©ā‚‚
  field
    AƗB : Obj
    Ļ€a : AƗB ⇒₁ A
    Ļ€b : AƗB ⇒₁ B
    ⟨_,_āŸ©ā‚ : āˆ€ {Ī“} → Ī“ ⇒₁ A → Ī“ ⇒₁ B → Ī“ ⇒₁ AƗB
    ⟨_,_āŸ©ā‚‚ : āˆ€ {Ī“}{fa ga : Ī“ ⇒₁ A}{fb gb : Ī“ ⇒₁ B}
           → fa ⇒₂ ga → fb ⇒₂ gb → ⟨ fa , fb āŸ©ā‚ ⇒₂ ⟨ ga , gb āŸ©ā‚

    β₁a : āˆ€ {Ī“} f g → hom Ī“ A [ Ļ€a āˆ˜ā‚ ⟨ f , g āŸ©ā‚  ≅ f ]
    β₁b : āˆ€ {Ī“} f g → hom Ī“ B [ Ļ€b āˆ˜ā‚ ⟨ f , g āŸ©ā‚  ≅ g ]
    β₂a : āˆ€ {Ī“}{fa ga fb gb}(αa : hom Ī“ A [ fa , ga ])(αb : hom Ī“ B [ fb , gb ])
        → Along β₁a _ _ , β₁a _ _ [ Ļ€a ā–· ⟨ αa , αb āŸ©ā‚‚ ā‰ˆ αa ] 
    β₂b : āˆ€ {Ī“}{fa ga fb gb}(αa : hom Ī“ A [ fa , ga ])(αb : hom Ī“ B [ fb , gb ])
        → Along β₁b _ _ , β₁b _ _ [ Ļ€b ā–· ⟨ αa , αb āŸ©ā‚‚ ā‰ˆ αb ] 

    η₁ : āˆ€ {Ī“} p → hom Ī“ AƗB [ p ≅ ⟨ Ļ€a āˆ˜ā‚ p , Ļ€b āˆ˜ā‚ p āŸ©ā‚ ]
    Ī·ā‚‚ : āˆ€ {Ī“}{p p'}(Ļ• : hom Ī“ AƗB [ p , p' ])
       → Along (η₁ _) , (η₁ _) [ Ļ• ā‰ˆ ⟨ Ļ€a ā–· Ļ• , Ļ€b ā–· Ļ• āŸ©ā‚‚ ]