module Cat.Diagram.Product.Power where

Power🔗

Powering is the formal dual to copowering.

  _⋔_ : Set ℓ → Ob → Ob
  X ⋔ A = prods X (λ _ → A) .ΠF

Powers satisfy the universal property that, for and we have a natural isomorphism

  power-hom-iso
    : ∀ {X A}
    → Hom-into C (X ⋔ A) ≅ⁿ (unopF $ opFʳ (Hom-into (Sets ℓ ^op) X)) F∘ Hom-into C A
  power-hom-iso {X} {A} = iso→isoⁿ
    (λ _ → equiv→iso (hom-iso (prods X (λ _ → A))))
    (λ _ → ext λ _ _ → sym $ assoc _ _ _)
  Powering : Functor (Sets ℓ ^op ×ᶜ C) C
  Powering .F₀ (X , A) = X ⋔ A
  Powering .F₁ {X , A} {Y , B} (idx , obj) = prods Y (λ _ → B) .tuple λ i →
    obj ∘ prods X (λ _ → A) .π (idx i)
  Powering .F-id {X , A} = prods X (λ _ → A) .unique _ λ i → id-comm
  Powering .F-∘ {z = Z , C} f g = prods Z (λ _ → C) .unique _ λ i →
    pulll (prods _ _ .commute) ∙ extendr (prods _ _ .commute)
  ∏! : (Idx : Type ℓ) ⦃ hl : H-Level Idx 2 ⦄ (F : Idx → Ob) → Ob
  ∏! Idx F = ΠF (prods (el! Idx) F)

  module ∏! (Idx : Type ℓ) ⦃ hl : H-Level Idx 2 ⦄ (F : Idx → Ob) =
    Indexed-product (prods (el! Idx) F)

  _⋔!_ : (Idx : Type ℓ) ⦃ hl : H-Level Idx 2 ⦄ → Ob → Ob
  S ⋔! X = el! S ⋔ X

  module ⋔! (Idx : Type ℓ) ⦃ hl : H-Level Idx 2 ⦄ (X : Ob) =
    Indexed-product (prods (el! Idx) (λ _ → X))