{-# OPTIONS --without-K --safe #-}

open import Categories.Category

module Categories.Category.Cocomplete.Properties.Construction {o  e} (C : Category o  e) where

open import Level

open import Categories.Category.Construction.Arrow using (Morphism)
open import Categories.Category.Cocomplete using (Cocomplete)
open import Categories.Diagram.Coequalizer C using (Coequalizer)
open import Categories.Diagram.Colimit.Properties using (build-colim)
open import Categories.Functor using (Functor)
open import Categories.Object.Coproduct.Indexed C using (AllCoproductsOf)
open import Categories.Object.Coproduct.Indexed.Properties C using (lowerAllCoproductsOf)

private
  variable
    o′ ℓ′ e′ : Level

module _ (coprods : AllCoproductsOf (o′  ℓ′)) (coequalizer :  {A B} (f g : C [ A , B ])  Coequalizer f g) where

  AllCoproducts×Coequalizer⇒Cocomplete : Cocomplete o′ ℓ′ e′ C
  AllCoproducts×Coequalizer⇒Cocomplete F = build-colim {OP = OP} {MP = MP} (coequalizer _ _)
    where
      open Functor F
      OP = lowerAllCoproductsOf ℓ′ coprods F₀
      MP = lowerAllCoproductsOf o′ coprods λ f  F₀ (Morphism.dom f)