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

open import lib.Basics
open import lib.types.LoopSpace
open import 2Semigroup
open import 2SGrpMap
open import 2Grp
open import Hmtpy2Grp
open import KFunctor
open import K-hom-ind
open import KFunctor-comp
open import Delooping
open import LoopFunctor-ap

module LoopK-ptr-comp where

module _ {i j k} {G₁ : Type i} {G₂ : Type j} {G₃ : Type k}
  {{η₁ : CohGrp G₁}} {{η₂ : CohGrp G₂}} {{η₃ : CohGrp G₃}}
  (m₁@(cohgrphom f₁ {{σ₁}}) : CohGrpHom {{η₁}} {{η₂}}) (m₂@(cohgrphom f₂ {{σ₂}}) : CohGrpHom {{η₂}} {{η₃}})
  (x : G₁) where

  private
    τ = Ω-fmap-ap (K₂-map-∘ σ₁ σ₂) (loop G₁ x)  ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x)
    ν =
      λ v 
        K₂-map-β-pts (m₂ ∘2Gσ m₁) v 
        ! (K₂-map-β-pts σ₂ (f₁ v)) 
        ! (ap (ap (K₂-map σ₂)) (K₂-map-β-pts σ₁ v)) 
        ∘-ap (K₂-map σ₂) (K₂-map σ₁) (loop G₁ v)
    Λ =
      ! (K₂-map-β-pts (m₂ ∘2Gσ m₁) x) ◃∙
      K₂-map-β-pts (m₂ ∘2Gσ m₁) x ◃∙
      ! (K₂-map-β-pts σ₂ (f₁ x)) ◃∙
      ! (ap (ap (K₂-map σ₂)) (K₂-map-β-pts σ₁ x)) ◃∙
      ∘-ap (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x) ◃∙
      ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x) ◃∙
      ap (ap (K₂-map σ₂)) (K₂-map-β-pts σ₁ x) ◃∙
      K₂-map-β-pts σ₂ (f₁ x) ◃∎

  module LKC-aux where

    abstract
      LoopK-∘-aux : Λ =ₛ idp ◃∎
      LoopK-∘-aux =
        Λ
          =ₛ₁⟨ 0 & 2 & !-inv-l (K₂-map-β-pts (m₂ ∘2Gσ m₁) x) 
        idp ◃∙
        ! (K₂-map-β-pts σ₂ (f₁ x)) ◃∙
        ! (ap (ap (K₂-map σ₂)) (K₂-map-β-pts σ₁ x)) ◃∙
        ∘-ap (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x) ◃∙
        ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x) ◃∙
        ap (ap (K₂-map σ₂)) (K₂-map-β-pts σ₁ x) ◃∙
        K₂-map-β-pts σ₂ (f₁ x) ◃∎
          =ₛ₁⟨ 3 & 2 & ∘-ap-ap-∘-inv (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x) 
        idp ◃∙
        ! (K₂-map-β-pts σ₂ (f₁ x)) ◃∙
        ! (ap (ap (K₂-map σ₂)) (K₂-map-β-pts σ₁ x)) ◃∙
        idp ◃∙
        ap (ap (K₂-map σ₂)) (K₂-map-β-pts σ₁ x) ◃∙
        K₂-map-β-pts σ₂ (f₁ x) ◃∎
          =ₛ₁⟨ 2 & 3 & !-inv-l (ap (ap (K₂-map σ₂)) (K₂-map-β-pts σ₁ x)) 
        idp ◃∙
        ! (K₂-map-β-pts σ₂ (f₁ x)) ◃∙
        idp ◃∙
        K₂-map-β-pts σ₂ (f₁ x) ◃∎
          =ₛ₁⟨ !-inv-l (K₂-map-β-pts σ₂ (f₁ x)) 
        idp ◃∎ ∎ₛ

  open LKC-aux

  abstract
    LoopK-∘ :
      ! (K₂-map-β-pts (m₂ ∘2Gσ m₁) x) ◃∙
      (WkSGrpNatIso.θ (Loop2Grp-map-ap (K₂-map-∘ σ₁ σ₂)) (loop G₁ x) 
      ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x)) ◃∙
      ap (Ω-fmap (K₂-map⊙ σ₂)) (K₂-map-β-pts σ₁ x) ◃∙
      K₂-map-β-pts σ₂ (f₁ x) ◃∙
      idp ◃∎
        =ₛ
      idp ◃∎
    LoopK-∘ =
      ! (K₂-map-β-pts (m₂ ∘2Gσ m₁) x) ◃∙
      (WkSGrpNatIso.θ (Loop2Grp-map-ap (K₂-map-∘ σ₁ σ₂)) (loop G₁ x) 
      ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x)) ◃∙
      ap (Ω-fmap (K₂-map⊙ σ₂)) (K₂-map-β-pts σ₁ x) ◃∙
      K₂-map-β-pts σ₂ (f₁ x) ◃∙
      idp ◃∎
        =ₛ₁⟨ 1 & 1 & ap  p  p  ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x)) (Loop2Grp-map-ap-fst (K₂-map-∘ σ₁ σ₂) (loop G₁ x)) 
      ! (K₂-map-β-pts (m₂ ∘2Gσ m₁) x) ◃∙
      (Ω-fmap-ap (K₂-map-∘ σ₁ σ₂) (loop G₁ x) 
      ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x)) ◃∙
      ap (Ω-fmap (K₂-map⊙ σ₂)) (K₂-map-β-pts σ₁ x) ◃∙
      K₂-map-β-pts σ₂ (f₁ x) ◃∙
      idp ◃∎
        =ₛ₁⟨ 3 & 2 & ∙-unit-r (K₂-map-β-pts σ₂ (f₁ x)) 
      ! (K₂-map-β-pts (m₂ ∘2Gσ m₁) x) ◃∙
      (Ω-fmap-ap (K₂-map-∘ σ₁ σ₂) (loop G₁ x) 
      ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x)) ◃∙
      ap (Ω-fmap (K₂-map⊙ σ₂)) (K₂-map-β-pts σ₁ x) ◃∙
      K₂-map-β-pts σ₂ (f₁ x) ◃∎
        =ₑ⟨ 1 & 1 & (Ω-fmap-ap (K₂-map-∘ σ₁ σ₂) (loop G₁ x) ◃∙ ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x) ◃∎) % =ₛ-in (idp {a = τ}) 
      ! (K₂-map-β-pts (m₂ ∘2Gσ m₁) x) ◃∙
      Ω-fmap-ap (K₂-map-∘ σ₁ σ₂) (loop G₁ x) ◃∙
      ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x) ◃∙
      ap (Ω-fmap (K₂-map⊙ σ₂)) (K₂-map-β-pts σ₁ x) ◃∙
      K₂-map-β-pts σ₂ (f₁ x) ◃∎
        =ₛ⟨ 1 & 1 & Ω-fmap-ap-hnat (K₂-map-∘ σ₁ σ₂) (loop G₁ x) 
      ! (K₂-map-β-pts (m₂ ∘2Gσ m₁) x) ◃∙
      idp ◃∙
      ap  q  q) (hmtpy-nat-∙' (fst (K₂-map-∘ σ₁ σ₂)) (loop G₁ x)) ◃∙
      idp ◃∙
      ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x) ◃∙
      ap (Ω-fmap (K₂-map⊙ σ₂)) (K₂-map-β-pts σ₁ x) ◃∙
      K₂-map-β-pts σ₂ (f₁ x) ◃∎
        =ₛ₁⟨ 1 & 3 &
          ∙-unit-r (ap  q  q) (hmtpy-nat-∙' (fst (K₂-map-∘ σ₁ σ₂)) (loop G₁ x)))  ap-idf (hmtpy-nat-∙' (fst (K₂-map-∘ σ₁ σ₂)) (loop G₁ x)) 
      ! (K₂-map-β-pts (m₂ ∘2Gσ m₁) x) ◃∙
      hmtpy-nat-∙' (fst (K₂-map-∘ σ₁ σ₂)) (loop G₁ x) ◃∙
      ap-∘ (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x) ◃∙
      ap (Ω-fmap (K₂-map⊙ σ₂)) (K₂-map-β-pts σ₁ x) ◃∙
      K₂-map-β-pts σ₂ (f₁ x) ◃∎
        =ₑ⟨ 1 & 1 &
          (K₂-map-β-pts (m₂ ∘2Gσ m₁) x ◃∙
          ! (K₂-map-β-pts σ₂ (f₁ x)) ◃∙
          ! (ap (ap (K₂-map σ₂)) (K₂-map-β-pts σ₁ x)) ◃∙
          ∘-ap (K₂-map σ₂) (K₂-map σ₁) (loop G₁ x) ◃∎) %
          =ₛ-in (K₂-∼-ind-β (map₁-∘ σ₁ σ₂) (map₂-∘ σ₁ σ₂) idp ν _ x) 
      Λ
        =ₛ⟨ LoopK-∘-aux 
      idp ◃∎ ∎ₛ