{-# OPTIONS --without-K --rewriting #-}

open import HoTT
open import homotopy.JoinComm
open import homotopy.JoinAssocCubical

module homotopy.JoinSusp where

module _ {i} (A : Type i) where

  private

      module Into = JoinRec {A = Bool} {B = A}
        {D = Susp A}
        (if_then north else south)
         _  south)
         {(true , a)  merid a;
            (false , a)  idp})

      into = Into.f

      module Out = SuspRec {C = Bool * A}
        (left true)
        (left false)
         a  glue (true , a)  ! (glue (false , a)))

      out = Out.f

      into-out :  σ  into (out σ) == σ
      into-out = Susp-elim
        idp
        idp
        (↓-∘=idf-from-square into out  λ a  vert-degen-square $
           ap (ap into) (Out.merid-β a)
            ap-∙ into (glue (true , a)) (! (glue (false , a)))
            (Into.glue-β (true , a)
              ∙2 (ap-! into (glue (false , a))
                   ap ! (Into.glue-β (false , a))))
            ∙-unit-r _)

      out-into :  j  out (into j) == j
      out-into = Join-elim
        (λ{true  idp ; false  idp})
         a  glue (false , a))
        (↓-∘=idf-from-square out into 
          λ {(true , a) 
                (ap (ap out) (Into.glue-β (true , a))  Out.merid-β a)
                ∙v⊡ (vid-square {p = glue (true , a)}
                      ⊡h rt-square (glue (false , a)))
                ⊡v∙ ∙-unit-r _;
             (false , a) 
               ap (ap out) (Into.glue-β (false , a)) ∙v⊡ connection})

  *-Bool-l : Bool * A  Susp A
  *-Bool-l = equiv into out into-out out-into

module _ {i} (X : Ptd i) where

  ⊙*-Bool-l : ⊙Bool ⊙* X ⊙≃ ⊙Susp X
  ⊙*-Bool-l = ≃-to-⊙≃ (*-Bool-l (de⊙ X)) idp

module _ {i j} (A : Type i) (B : Type j) where

  *-Susp-l : Susp A * B  Susp (A * B)
  *-Susp-l = *-Bool-l (A * B) ∘e *-assoc Bool A B ∘e *-emap (*-Bool-l A) (ide B) ⁻¹

module _ {i j} (X : Ptd i) (Y : Ptd j) where

  ⊙*-Susp-l : ⊙Susp X ⊙* Y ⊙≃ ⊙Susp (X ⊙* Y)
  ⊙*-Susp-l = ≃-to-⊙≃ (*-Susp-l (de⊙ X) (de⊙ Y)) idp

module _ {i} where

  ⊙*-Sphere-l : (m : ) (X : Ptd i)  ⊙Sphere m ⊙* X ⊙≃ ⊙Susp^ (S m) X
  ⊙*-Sphere-l O X = ⊙*-Bool-l X
  ⊙*-Sphere-l (S m) X = ⊙Susp-emap (⊙*-Sphere-l m X) ⊙∘e ⊙*-Susp-l (⊙Sphere m) X