{-# OPTIONS --safe #-}
module Cubical.HITs.UnorderedPair.Properties where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function
open import Cubical.Foundations.Isomorphism
open import Cubical.Data.Sigma
open import Cubical.HITs.SetCoequalizer as SQ
open import Cubical.HITs.UnorderedPair.Base as UP
open Iso
private variable
ℓ : Level
A : Type ℓ
SetCoequalizerPair : Type ℓ → Type ℓ
SetCoequalizerPair A = SetCoequalizer (idfun (A × A)) (λ (a , b) → b , a)
SetCoeq→UPair : SetCoequalizerPair A → UnorderedPair A
SetCoeq→UPair = SQ.rec trunc (uncurry _,_) (uncurry swap)
UPair→SetCoeq : UnorderedPair A → SetCoequalizerPair A
UPair→SetCoeq = UP.rec squash (curry inc) (curry coeq)
SetCoeq→UPair→SetCoeq : (xs : UnorderedPair A) → SetCoeq→UPair (UPair→SetCoeq xs) ≡ xs
SetCoeq→UPair→SetCoeq = UP.elimProp (trunc _ _) λ _ _ → refl
UPair→SetCoeq→SetCoeq : (xs : SetCoequalizerPair A) → UPair→SetCoeq (SetCoeq→UPair xs) ≡ xs
UPair→SetCoeq→SetCoeq = SQ.elimProp (λ _ → squash _ _) λ _ → refl
SetCoeqIsoUPair : Iso (SetCoequalizerPair A) (UnorderedPair A)
fun SetCoeqIsoUPair = SetCoeq→UPair
inv SetCoeqIsoUPair = UPair→SetCoeq
rightInv SetCoeqIsoUPair = SetCoeq→UPair→SetCoeq
leftInv SetCoeqIsoUPair = UPair→SetCoeq→SetCoeq
SetCoeq≡UPair : SetCoequalizerPair A ≡ UnorderedPair A
SetCoeq≡UPair = isoToPath SetCoeqIsoUPair