open import Cubical.Foundations.Prelude
open import Cubical.Categories.Category
open import Cubical.Categories.Displayed.Base
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.HLevels
open import Cubical.Data.Sigma
open import Cubical.HITs.PropositionalTruncation
open import Categories.CartesianMorphism

module Categories.GenericObject where

module _
  {ℓB ℓ'B ℓE ℓ'E}
  {B : Category ℓB ℓ'B}
  (E : Categoryᴰ B ℓE ℓ'E) where

  open Category B
  open Categoryᴰ E
  open Contravariant E

  record GenericObject : Type (ℓ-max (ℓ-max ℓB ℓ'B) (ℓ-max ℓE ℓ'E)) where
    constructor makeGenericObject
    field
      base : ob
      displayed : ob[ base ]
      isGeneric :
         {t : ob} (tᴰ : ob[ t ])
         Σ[ f  Hom[ t , base ] ] Σ[ fᴰ  Hom[ f ][ tᴰ , displayed ] ] isCartesian f fᴰ