{-# OPTIONS --without-K --rewriting #-} open import lib.Basics open import lib.types.Bool open import lib.types.Coproduct open import lib.types.Paths open import lib.types.Span open import lib.types.Pushout open import lib.types.Cofiber open import lib.types.Sigma open import lib.types.Wedge module lib.types.Smash {i j} where module _ (X : Ptd i) (Y : Ptd j) where ⊙∧-span : ⊙Span ⊙∧-span = ⊙span (X ⊙× Y) ⊙Bool (X ⊙⊔ Y) (⊔-rec (_, pt Y) (pt X ,_) , idp) (⊙⊔-fmap {Y = Y} ⊙cst ⊙cst) ∧-span : Span ∧-span = ⊙Span-to-Span ⊙∧-span _∧_ = Pushout ∧-span _⊙∧_ = ⊙Pushout ⊙∧-span Smash = _∧_ ⊙Smash = _⊙∧_ module _ {X : Ptd i} {Y : Ptd j} where smin : de⊙ X → de⊙ Y → Smash X Y smin x y = left (x , y) smbasel : Smash X Y smbasel = right true smbaser : Smash X Y smbaser = right false smgluel : (x : de⊙ X) → smin x (pt Y) == smbasel smgluel x = glue (inl x) smgluer : (y : de⊙ Y) → smin (pt X) y == smbaser smgluer y = glue (inr y) module SmashElim {k} {P : Smash X Y → Type k} (smin* : (x : de⊙ X) (y : de⊙ Y) → P (smin x y)) (smbasel* : P smbasel) (smbaser* : P smbaser) (smgluel* : (x : de⊙ X) → smin* x (pt Y) == smbasel* [ P ↓ smgluel x ]) (smgluer* : (y : de⊙ Y) → smin* (pt X) y == smbaser* [ P ↓ smgluer y ]) where private module M = PushoutElim (uncurry smin*) (Coprod-elim (λ _ → smbasel*) (λ _ → smbaser*)) (Coprod-elim smgluel* smgluer*) f = M.f smgluel-β = M.glue-β ∘ inl smgluer-β = M.glue-β ∘ inr Smash-elim = SmashElim.f module SmashRec {k} {C : Type k} (smin* : (x : de⊙ X) (y : de⊙ Y) → C) (smbasel* smbaser* : C) (smgluel* : (x : de⊙ X) → smin* x (pt Y) == smbasel*) (smgluer* : (y : de⊙ Y) → smin* (pt X) y == smbaser*) where private module M = PushoutRec {d = ∧-span X Y} (uncurry smin*) (Coprod-rec (λ _ → smbasel*) (λ _ → smbaser*)) (Coprod-elim smgluel* smgluer*) f = M.f smgluel-β = M.glue-β ∘ inl smgluer-β = M.glue-β ∘ inr Smash-rec = SmashRec.f