{-# OPTIONS --safe #-} module Cubical.HITs.UnorderedPair.Base where open import Cubical.Foundations.Prelude open import Cubical.Foundations.HLevels private variable ℓ ℓ′ : Level A : Type ℓ infixr 4 _,_ data UnorderedPair (A : Type ℓ) : Type ℓ where _,_ : (x y : A) → UnorderedPair A swap : (x y : A) → (x , y) ≡ (y , x) trunc : isSet (UnorderedPair A) module _ {B : UnorderedPair A → Type ℓ′} (_,*_ : (x y : A) → B (x , y)) (swap* : (x y : A) → PathP (λ i → B (swap x y i)) (x ,* y) (y ,* x)) (trunc* : (xs : UnorderedPair A) → isSet (B xs)) where elim : (xs : UnorderedPair A) → B xs elim (x , y) = x ,* y elim (swap x y i) = swap* x y i elim (trunc x y p q i j) = isOfHLevel→isOfHLevelDep 2 trunc* (elim x) (elim y) (cong elim p) (cong elim q) (trunc x y p q) i j module _ {B : UnorderedPair A → Type ℓ′} (BProp : {xs : UnorderedPair A} → isProp (B xs)) (_,*_ : (x y : A) → B (x , y)) where elimProp : (xs : UnorderedPair A) → B xs elimProp = elim _,*_ (λ x y → toPathP (BProp (transport (λ i → B (swap x y i)) (x ,* y)) (y ,* x))) λ _ → isProp→isSet BProp module _ {B : Type ℓ′} (BType : isSet B) (_,*_ : (x y : A) → B) (swap* : (x y : A) → (x ,* y) ≡ (y ,* x)) where rec : UnorderedPair A → B rec = elim _,*_ swap* λ _ → BType