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

open import lib.Basics
open import lib.types.LoopSpace
open import 2Semigroup
open import 2Grp
open import Hmtpy2Grp
open import KFunctor
open import Delooping

module SqLoopK where

module _ {i j} {G₁ : Type i} {G₂ : Type j} {{η₁ : CohGrp G₁}} {{η₂ : CohGrp G₂}} where

  open CohGrp {{...}}
  open WkSGrpNatIso
  open WkSGrpHomStr

  sq-ΩK : {f : G₁  G₂} (σ : CohGrpHomStr f)
     CohGrpNatIso (Loop2Grp-map (K₂-map σ , idp) ∘2G K₂-loopmap G₁) (K₂-loopmap G₂ ∘2G cohgrphom f {{σ}})
  θ (sq-ΩK {f} σ) x = K₂-map-β-pts σ x
  θ-comp (sq-ΩK {f} σ) x y = ! (=ₛ-out lemma)
    where abstract
      lemma :
        ! (ap2 mu (K₂-map-β-pts σ x) (K₂-map-β-pts σ y)) ◃∙
        (∙-ap (K₂-map σ) (loop G₁ x) (loop G₁ y)  ap (ap (K₂-map σ)) (loop-comp G₁ x y)) ◃∙
        K₂-map-β-pts σ (mu x y) ◃∎
          =ₛ
        (loop-comp G₂ (f x) (f y)  ap (loop G₂) (map-comp σ x y)) ◃∎
      lemma = 
        ! (ap2 mu (K₂-map-β-pts σ x) (K₂-map-β-pts σ y)) ◃∙
        (∙-ap (K₂-map σ) (loop G₁ x) (loop G₁ y)  ap (ap (K₂-map σ)) (loop-comp G₁ x y)) ◃∙
        K₂-map-β-pts σ (mu x y) ◃∎
          =ₛ⟨ 2 & 1 & K₂-map-β-comp σ x y 
        ! (ap2 mu (K₂-map-β-pts σ x) (K₂-map-β-pts σ y)) ◃∙
        (∙-ap (K₂-map σ) (loop G₁ x) (loop G₁ y)  ap (ap (K₂-map σ)) (loop-comp G₁ x y)) ◃∙
        ! (ap (ap (K₂-map σ)) (loop-comp G₁ x y)) ◃∙
        ! (∙-ap (K₂-map σ) (loop G₁ x) (loop G₁ y)) ◃∙
        ap2 _∙_ (K₂-map-β-pts σ x) (K₂-map-β-pts σ y) ◃∙
        loop-comp G₂ (f x) (f y) ◃∙
        ap (loop G₂) (map-comp σ x y) ◃∎
          =ₑ⟨ 1 & 1 & (∙-ap (K₂-map σ) (loop G₁ x) (loop G₁ y) ◃∙ ap (ap (K₂-map σ)) (loop-comp G₁ x y) ◃∎) % =ₛ-in idp 
        ! (ap2 mu (K₂-map-β-pts σ x) (K₂-map-β-pts σ y)) ◃∙
        ∙-ap (K₂-map σ) (loop G₁ x) (loop G₁ y) ◃∙
        ap (ap (K₂-map σ)) (loop-comp G₁ x y) ◃∙
        ! (ap (ap (K₂-map σ)) (loop-comp G₁ x y)) ◃∙
        ! (∙-ap (K₂-map σ) (loop G₁ x) (loop G₁ y)) ◃∙
        ap2 _∙_ (K₂-map-β-pts σ x) (K₂-map-β-pts σ y) ◃∙
        loop-comp G₂ (f x) (f y) ◃∙
        ap (loop G₂) (map-comp σ x y) ◃∎
          =ₛ₁⟨ 2 & 2 & !-inv-r (ap (ap (K₂-map σ)) (loop-comp G₁ x y)) 
        _
          =ₛ₁⟨ 1 & 3 & !-inv-r (∙-ap (K₂-map σ) (loop G₁ x) (loop G₁ y)) 
        _
          =ₛ₁⟨ 0 & 3 & !-inv-l (ap2 _∙_ (K₂-map-β-pts σ x) (K₂-map-β-pts σ y)) 
        idp ◃∙
        loop-comp G₂ (f x) (f y) ◃∙
        ap (loop G₂) (map-comp σ x y) ◃∎
          =ₛ₁⟨ idp 
        (loop-comp G₂ (f x) (f y)  ap (loop G₂) (map-comp σ x y)) ◃∎ ∎ₛ