Core.sum
import Core.equality (cong, transport)
swap : {a b : 𝕌} → a ⊎ b → b ⊎ a
swap = λa b t. ⊎-elim (x. inj₂ x) (y. inj₁ y) t
swapBeta1 : (a b : 𝕌) (x : a) → swap (inj₁ x) ≡ inj₂ x ∈ b ⊎ a using (Core.sum.swap.eq)
swapBeta1 = λa b x. ⋆
swapBeta2 : (a b : 𝕌) (y : b) → swap (inj₂ y) ≡ inj₁ y ∈ b ⊎ a using (Core.sum.swap.eq)
swapBeta2 = λa b y. ⋆
swapInvol : (a b : 𝕌) (t : a ⊎ b) → swap (swap t) ≡ t using (Core.sum.swap.eq)
swapInvol = λa b t. ⊎-elim (x. ⋆) (y. ⋆) t
sumEta : (a b c : 𝕌)
(f : a ⊎ b → c)
(t : a ⊎ b)
→ ⊎-elim (w. c) (x. f (inj₁ x)) (y. f (inj₂ y)) t ≡ f t
sumEta =
λa b c f t. ⊎-elim (w. ⊎-elim (v. c) (x. f (inj₁ x)) (y. f (inj₂ y)) w ≡ f w) (x. ⋆) (y. ⋆) t
toCode : {a b : 𝕌} → a ⊎ b → a ⊎ b
toCode = λa b t. ⊎-elim (x. inj₁ x) (y. inj₂ y) t
fromCode : {a b : 𝕌} → a ⊎ b → a ⊎ b
fromCode = λa b t. ⊎-elim (x. inj₁ x) (y. inj₂ y) t
toFromId : (a b : 𝕌) (t : a ⊎ b) → toCode (fromCode t) ≡ t
using (Core.sum.fromCode.eq, Core.sum.toCode.eq)
toFromId = λa b t. ⊎-elim (x. ⋆) (y. ⋆) t
outl : (a b : 𝕌) → a → a ⊎ b → a
outl = λa b d t. ⊎-elim (x. x) (y. d) t
inj1Injective : (a b : 𝕌) (x x' : a) → (inj₁ x ≡ inj₁ x' ∈ a ⊎ b) → x ≡ x' using (Core.sum.outl.eq)
inj1Injective = λa b x x' h. cong (λw. a) (outl _ b x) h
isLeftCode : (a b : 𝕌) → a ⊎ b → 𝕌
isLeftCode = λa b t. ⊎-elim (x. 𝟙) (y. 𝟘) t
inj1NotInj2 : (a b : 𝕌) (x : a) (y : b) → (inj₁ x ≡ inj₂ y ∈ a ⊎ b) → 𝟘
using (Core.sum.isLeftCode.unfold)
inj1NotInj2 = λa b x y h. transport (isLeftCode a b) h ()
outr : (a b : 𝕌) → b → a ⊎ b → b
outr = λa b d t. ⊎-elim (x. d) (y. y) t
inj2Injective : (a b : 𝕌) (y y' : b) → (inj₂ y ≡ inj₂ y' ∈ a ⊎ b) → y ≡ y' using (Core.sum.outr.eq)
inj2Injective = λa b y y' h. cong (λw. b) (outr a _ y) h