open import Cat.Diagram.Colimit.Coproduct
open import Cat.Diagram.Coproduct.Indexed
open import Cat.Diagram.Colimit.Base
open import Cat.Functor.Adjoint.Hom
open import Cat.Functor.Naturality
open import Cat.Instances.Discrete
open import Cat.Instances.Product
open import Cat.Diagram.Terminal
open import Cat.Functor.Adjoint
open import Cat.Instances.Sets
open import Cat.Functor.Hom
open import Cat.Prelude

import Cat.Reasoning
module Cat.Diagram.Coproduct.Copower where

Copowers🔗

Let be a category admitting indexed coproducts, for example a cocomplete category. In the same way that (in ordinary arithmetic) the iterated product of a bunch of copies of the same factor

is called a “power”, we refer to the coproduct of many copies of an object indexed by a set as the copower of by and alternatively denote it If does indeed admit coproducts indexed by any set, then the copowering construction extends to a functor

The notion of copowering gives us slick terminology for a category which admits all coproducts, but not necessarily all colimits: Such a category is precisely one copowered over

module Copowers
  {o ℓ} {C : Precategory o ℓ}
  (coprods : (S : Set)  has-coproducts-indexed-by C ∣ S ∣)
  where

  open Indexed-coproduct
  open Cat.Reasoning C
  open Functor
  __ : Set Ob  Ob
  X ⊗ A = coprods X  _  A) .ΣF

Copowers satisfy a universal property: is a representing object for the functor that takes an object to the power of the set of morphisms from to in other words, we have a natural isomorphism

  copower-hom-iso
    :  {X A}
     Hom-from C (X ⊗ A) ≅ⁿ Hom-from (Sets ℓ) X F∘ Hom-from C A
  copower-hom-iso {X} {A} = iso→isoⁿ
     _  equiv→iso (hom-iso (coprods X  _  A))))
     _  ext λ _ _  assoc _ _ _)

The action of the copowering functor is given by simultaneously changing the indexing along a function of sets and changing the underlying object by a morphism This is functorial by the uniqueness properties of colimiting maps.

  Copowering : Functor (Sets ℓ ×ᶜ C) C
  Copowering .F₀ (X , A) = X ⊗ A
  Copowering .F₁ {X , A} {Y , B} (idx , obj) =
    coprods X  _  A) .match λ i  coprods Y  _  B) .ι (idx i) ∘ obj
  Copowering .F-id {X , A} = sym $
    coprods X  _  A) .unique _ λ i  sym id-comm
  Copowering .F-∘ {X , A} f g = sym $
    coprods X  _  A) .unique _ λ i 
      pullr (coprods _ _ .commute) ∙ extendl (coprods _ _ .commute)
  ∐! : (Idx : Type ℓ) ⦃ hl : H-Level Idx 2(F : Idx  Ob)  Ob
  ∐! Idx F = ΣF (coprods (el! Idx) F)

  module ∐! (Idx : Type ℓ) ⦃ hl : H-Level Idx 2(F : Idx  Ob) =
    Indexed-coproduct (coprods (el! Idx) F)

  _⊗!_ : (Idx : Type ℓ) ⦃ hl : H-Level Idx 2 Ob  Ob
  I ⊗! X = el! I ⊗ X

  module ⊗! (Idx : Type ℓ) ⦃ hl : H-Level Idx 2(X : Ob) =
    Indexed-coproduct (coprods (el! Idx)  _  X))
cocomplete→copowering
  :  {o ℓ} {C : Precategory o ℓ}
   is-cocomplete ℓ ℓ C  Functor (Sets ℓ ×ᶜ C) C
cocomplete→copowering colim = Copowers.Copowering λ S F 
  Colimit→IC _ (is-hlevel-suc 2 (S .is-tr)) F (colim _)

Constant objects🔗

If has a terminal object then the copower is referred to as the constant object on By simplifying the universal property of the copower, we obtain that constant objects assemble into a functor left adjoint to 1

module Consts
  {o ℓ} {C : Precategory o ℓ}
  (term : Terminal C)
  (coprods : (S : Set)  has-coproducts-indexed-by C ∣ S ∣)
  where

  open Indexed-coproduct
  open Cat.Reasoning C
  open Copowers coprods
  open Functor

  open Terminal term renaming (top to *C)
  Constant-objects : Functor (Sets ℓ) C
  Constant-objects .F₀ S = S ⊗ *C
  Constant-objects .F₁ f = coprods _ _ .match λ i  coprods _ _ .ι (f i)
  Constant-objects .F-id = sym $ coprods _ _ .unique _ λ i  idl _
  Constant-objects .F-∘ f g = sym $ coprods _ _ .unique _ λ i 
    pullr (coprods _ _ .commute) ∙ coprods _ _ .commute

  Const⊣Γ : Constant-objects ⊣ Hom-from _ *C
  Const⊣Γ = hom-iso→adjoints
     f x  f ∘ coprods _ _ .ι x)
    (is-iso→is-equiv (iso
       h  coprods _ _ .match h)
       h  ext λ i  coprods _ _ .commute)
       x  sym (coprods _ _ .unique _ λ i  refl))))
     g h x  ext λ y  pullr (pullr (coprods _ _ .commute)))

  1. This right adjoint is often called the global sections functor.↩︎