{-# OPTIONS --cubical --safe #-}

module Categories.Exponential where

open import Prelude hiding (_×_)
open import Categories
open import Categories.Product

module _ {ℓ₁ ℓ₂} (C : Category ℓ₁ ℓ₂) (hasProducts : HasProducts C) where
  open Category C
  open HasProducts hasProducts

  module _ (Y Z : Ob) where
    record Exponential : Type (ℓ₁ ℓ⊔ ℓ₂) where
      field
        obj : Ob
        eval : C [ obj × Y , Z ]
        uniq :  (X : Ob) (f : C [ X × Y , Z ]) 
              ∃![ f~ ] (C [ eval  (f~ |×| Category.Id C) ]  f)

  HasExponentials : Type (ℓ₁ ℓ⊔ ℓ₂)
  HasExponentials =  X Y  Exponential X Y