module Cubical.Categories.Instances.Power where

open import Cubical.Foundations.Prelude

open import Cubical.Categories.Category
open import Cubical.Categories.Instances.Product
open import Cubical.Categories.Functor
open import Cubical.Categories.Instances.Sets

private
  variable
    ℓ ℓc ℓc' : Level

open Category

PowerCategory : (X : Type ℓ) (C : Category ℓc ℓc') → Category _ _
PowerCategory X C = ΠC X (λ _ → C)

PseudoYoneda : {C : Category ℓc ℓc'}
             → Functor C (PowerCategory (C .ob) (SET ℓc'))
PseudoYoneda {C = C} = Π-intro _ (λ _ → SET _) λ a → C [ a ,-]

isFaithfulPseudoYoneda : {C : Category ℓc ℓc'}
                       → Functor.isFaithful (PseudoYoneda {C = C})
isFaithfulPseudoYoneda {C = C} x y f g p =
  sym (C .⋆IdL f) ∙ (λ i → p i _ (C .id)) ∙ C .⋆IdL g