{-# OPTIONS --without-K --rewriting --overlapping-instances --instance-search-depth=4 #-}

open import lib.Basics
open import lib.NType2
open import lib.types.Sigma
open import lib.Equivalence2 hiding (linv; rinv)
open import lib.types.LoopSpace
open import 2Semigroup
open import 2Grp
open import Hmtpy2Grp
open import Codes

module Decode0 where

module _ {i} {G : Type i} {{η : CohGrp G}} where

  open CohGrp {{...}}

  open import Delooping G

  open WkSGrpNatIso

  module _ (x y : G) where

    loop-decode :
      loop (transport codes-fst (loop x) y)
        =-=
      transport  z  base == z) (loop x) (loop y)
    loop-decode = 
      loop (transport codes-fst (loop x) y)
        =⟪ ap loop ( (transp-codes x y)) 
      loop (mu y x)
        =⟪ ! (loop-comp y x) 
      loop y  loop x
        =⟪ ! (transp-cst=idf (loop x) (loop y)) 
      transport  z  base == z) (loop x) (loop y) ∎∎

    abstract
    
      codes-β-mu :
        θ codes-β (mu x y) ◃∎
          =ₛ
        ! ((∙-ap fst (ap codes (loop x)) (ap codes (loop y)) 
          ap (ap fst) (∙-Ω-fmap (codes , idp) (loop x) (loop y))) 
          ap (ap fst  ap codes) (loop-comp x y)) ◃∙
        ap2 _∙_ (θ codes-β x) (θ codes-β y) ◃∙
        (! (ua-∘e ((λ z  mu z x) , mu-post-iso x) ((λ z  mu z y) , mu-post-iso y)) 
        ap ua (pair= (λ=  v  ! (al v x y))) prop-has-all-paths-↓)) ◃∎
      codes-β-mu = θ-comp-rot codes-β x y

      coe-β-mu : (z : G)  
        coe-β ((λ v  mu v (mu x y)) , mu-post-iso (mu x y)) z ◃∎
          =ₛ
        app= (ap coe (ap ua (pair= (λ=  v  al v x y)) prop-has-all-paths-↓))) z ◃∙
        app= (ap coe (ua-∘e ((λ v  mu v x) , mu-post-iso x)
          ((λ v  mu v y) , mu-post-iso y))) z ◃∙
        coe-∙ (ua ((λ v  mu v x) , mu-post-iso x)) (ua ((λ v  mu v y) , mu-post-iso y)) z ◃∙
        ap (coe (ua ((λ v  mu v y) , mu-post-iso y)))
          (coe-β ((λ v  mu v x) , mu-post-iso x) z) ◃∙
        coe-β ((λ v  mu v y) , mu-post-iso y) (mu z x) ◃∙
        ! (al z x y) ◃∎
      coe-β-mu z =
        coe-β ((λ v  mu v (mu x y)) , mu-post-iso (mu x y)) z ◃∎
          =ₛ⟨ coe-β-∘ ((λ v  mu v x) , mu-post-iso x) ((λ v  mu v y) , mu-post-iso y)
                (pair= (λ=  v  al v x y)) prop-has-all-paths-↓) z 
        app= (ap coe (ap ua (pair= (λ=  v  al v x y)) prop-has-all-paths-↓))) z ◃∙
        app= (ap coe (ua-∘e ((λ v  mu v x) , mu-post-iso x)
          ((λ v  mu v y) , mu-post-iso y))) z ◃∙
        coe-∙ (ua ((λ v  mu v x) , mu-post-iso x)) (ua ((λ v  mu v y) , mu-post-iso y)) z ◃∙
        ap (coe (ua ((λ v  mu v y) , mu-post-iso y)))
          (coe-β ((λ v  mu v x) , mu-post-iso x) z) ◃∙
        coe-β ((λ v  mu v y) , mu-post-iso y) (mu z x) ◃∙
        ! (app= (ap –> (pair= (λ=  v  al v x y)) prop-has-all-paths-↓)) z) ◃∎
          =ₛ₁⟨ 5 & 1 &
            ap ! (
              ap (ap  u  u z)) (fst=-β (λ=  v  CohGrp.al η v x y)) prop-has-all-paths-↓) 
              app=-β  v  CohGrp.al η v x y) z) 
        app= (ap coe (ap ua (pair= (λ=  v  al v x y)) prop-has-all-paths-↓))) z ◃∙
        app= (ap coe (ua-∘e ((λ v  mu v x) , mu-post-iso x)
          ((λ v  mu v y) , mu-post-iso y))) z ◃∙
        coe-∙ (ua ((λ v  mu v x) , mu-post-iso x)) (ua ((λ v  mu v y) , mu-post-iso y)) z ◃∙
        ap (coe (ua ((λ v  mu v y) , mu-post-iso y)))
          (coe-β ((λ v  mu v x) , mu-post-iso x) z) ◃∙
        coe-β ((λ v  mu v y) , mu-post-iso y) (mu z x) ◃∙
        ! (al z x y) ◃∎ ∎ₛ