\import Equiv \import Paths \import Logic \data \fixr 2 Or (A B : \Type) | inl A | inr B \where { \func levelProp {A B : \Prop} (e : A -> B -> Empty) (x y : Or A B) : x = y \elim x, y | inl a, inl a' => pmap inl prop-pi | inl a, inr b => absurd (e a b) | inr b, inl a => absurd (e a b) | inr b, inr b' => pmap inr prop-pi \func map {A B C D : \Type} (e : Or A B) (f : A -> C) (g : B -> D) : Or C D \elim e | inl a => inl (f a) | inr b => inr (g b) \func rec {A B C : \Type} (f : A -> C) (g : B -> C) (e : Or A B) : C \elim e | inl a => f a | inr b => g b \func Or_Equiv (e1 e2 : Equiv) : Equiv {Or e1.A e2.A} {Or e1.B e2.B} \cowith | f => map __ e1 e2 | ret => map __ e1.ret e2.ret | ret_f => \case \elim __ \with { | inl a => pmap inl (e1.ret_f a) | inr b => pmap inr (e2.ret_f b) } | sec => map __ e1.sec e2.sec | f_sec => \case \elim __ \with { | inl a => pmap inl (e1.f_sec a) | inr b => pmap inr (e2.f_sec b) } }