{-# OPTIONS --without-K --safe #-} open import Level using (Level) open import Category.Cocomplete.Finitely.Bundle using (FinitelyCocompleteCategory) module Functor.Exact.Instance.Swap {o β„“ e : Level} (π’ž π’Ÿ : FinitelyCocompleteCategory o β„“ e) where open import Categories.Category using (_[_,_]) open import Categories.Category.BinaryProducts using (BinaryProducts) open import Categories.Category.Product using (Product) renaming (Swap to Swapβ€²) open import Categories.Category.Cartesian using (Cartesian) open import Categories.Diagram.Coequalizer using (IsCoequalizer) open import Categories.Object.Initial using (IsInitial) open import Categories.Object.Coproduct using (IsCoproduct) open import Data.Product.Base using (_,_; proj₁; projβ‚‚; swap) open import Category.Instance.FinitelyCocompletes {o} {β„“} {e} using (FinitelyCocompletes-Cartesian) open import Functor.Exact using (RightExactFunctor) module FCC = Cartesian FinitelyCocompletes-Cartesian open BinaryProducts (FCC.products) using (_Γ—_) -- ; π₁; Ο€β‚‚; _⁂_; assocΛ‘) module π’ž = FinitelyCocompleteCategory π’ž module π’Ÿ = FinitelyCocompleteCategory π’Ÿ swap-resp-βŠ₯ : {A : π’ž.Obj} {B : π’Ÿ.Obj} β†’ IsInitial (Product π’ž.U π’Ÿ.U) (A , B) β†’ IsInitial (Product π’Ÿ.U π’ž.U) (B , A) swap-resp-βŠ₯ {A} {B} isInitial = record { ! = swap ! ; !-unique = Ξ» { (f , g) β†’ swap (!-unique (g , f)) } } where open IsInitial isInitial swap-resp-+ : {A₁ B₁ A+B₁ : π’ž.Obj} β†’ {Aβ‚‚ Bβ‚‚ A+Bβ‚‚ : π’Ÿ.Obj} β†’ {i₁₁ : π’ž.U [ A₁ , A+B₁ ]} β†’ {i₂₁ : π’ž.U [ B₁ , A+B₁ ]} β†’ {i₁₂ : π’Ÿ.U [ Aβ‚‚ , A+Bβ‚‚ ]} β†’ {iβ‚‚β‚‚ : π’Ÿ.U [ Bβ‚‚ , A+Bβ‚‚ ]} β†’ IsCoproduct (Product π’ž.U π’Ÿ.U) (i₁₁ , i₁₂) (i₂₁ , iβ‚‚β‚‚) β†’ IsCoproduct (Product π’Ÿ.U π’ž.U) (i₁₂ , i₁₁) (iβ‚‚β‚‚ , i₂₁) swap-resp-+ {A₁} {B₁} {A+B₁} {Aβ‚‚} {Bβ‚‚} {A+Bβ‚‚} {i₁₁} {i₂₁} {i₁₂} {iβ‚‚β‚‚} isCoproduct = record { [_,_] = Ξ» { X Y β†’ swap ([ swap X , swap Y ]) } ; inject₁ = swap inject₁ ; injectβ‚‚ = swap injectβ‚‚ ; unique = Ξ» { β‰ˆβ‚ β‰ˆβ‚‚ β†’ swap (unique (swap β‰ˆβ‚) (swap β‰ˆβ‚‚)) } } where open IsCoproduct isCoproduct swap-resp-coeq : {A₁ B₁ C₁ : π’ž.Obj}Β  {Aβ‚‚ Bβ‚‚ Cβ‚‚ : π’Ÿ.Obj} {f₁ g₁ : π’ž.U [ A₁ , B₁ ]} {h₁ : π’ž.U [ B₁ , C₁ ]} {fβ‚‚ gβ‚‚ : π’Ÿ.U [ Aβ‚‚ , Bβ‚‚ ]} {hβ‚‚ : π’Ÿ.U [ Bβ‚‚ , Cβ‚‚ ]} β†’ IsCoequalizer (Product π’ž.U π’Ÿ.U) (f₁ , fβ‚‚) (g₁ , gβ‚‚) (h₁ , hβ‚‚) β†’ IsCoequalizer (Product π’Ÿ.U π’ž.U) (fβ‚‚ , f₁) (gβ‚‚ , g₁) (hβ‚‚ , h₁) swap-resp-coeq isCoequalizer = record { equality = swap equality ; coequalize = Ξ» { x β†’ swap (coequalize (swap x)) } ; universal = swap universal ; unique = Ξ» { x β†’ swap (unique (swap x)) } } where open IsCoequalizer isCoequalizer Swap : RightExactFunctor (π’ž Γ— π’Ÿ) (π’Ÿ Γ— π’ž) Swap = record { F = Swapβ€² ; isRightExact = record { F-resp-βŠ₯ = swap-resp-βŠ₯ ; F-resp-+ = swap-resp-+ ; F-resp-coeq = swap-resp-coeq } }