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

open import lib.Basics
open import lib.FTID
open import lib.types.Pointed
open import lib.types.LoopSpace
open import 2GrpMap
open import Hmtpy2Grp
open import 2Semigroup
open import 2Grp

module LoopFunctor-ap where

open WkSGrpNatIso

module _ {ℓ₁ ℓ₂} {X₁ : Ptd ℓ₁} {X₂ : Ptd ℓ₂} {{η₁ : has-level 2 (de⊙ X₁)}} {{η₂ : has-level 2 (de⊙ X₂)}} where

  Loop2Grp-map-ap : {f* g* : X₁ ⊙→ X₂} → f* ⊙-crd∼ g* → CohGrpNatIso (Loop2Grp-map f*) (Loop2Grp-map g*)
  Loop2Grp-map-ap {f*} = 
    ⊙hom-ind f*
      (λ g* _ → CohGrpNatIso (Loop2Grp-map f*) (Loop2Grp-map g*))
      (natiso-id2G (Loop2Grp-map f*))
      
  Loop2Grp-map-ap-β : (f* : X₁ ⊙→ X₂) → Loop2Grp-map-ap (⊙∼-id f*) == natiso-id2G (Loop2Grp-map f*)
  Loop2Grp-map-ap-β f* =
    ⊙hom-ind-β f* (λ g* _ → CohGrpNatIso (Loop2Grp-map f*) (Loop2Grp-map g*)) (natiso-id2G (Loop2Grp-map f*))

  Loop2Grp-map-ap-fst : {f* g* : X₁ ⊙→ X₂} (H : f* ⊙-crd∼ g*) → θ (Loop2Grp-map-ap H) ∼ Ω-fmap-ap H
  Loop2Grp-map-ap-fst {f*} =
    ⊙hom-ind f*
      (λ _ H → θ (Loop2Grp-map-ap H) ∼ Ω-fmap-ap H)
      (λ x → app= (ap θ (Loop2Grp-map-ap-β f*)) x ∙ ! (Ω-fmap-ap-β f* x))

  Ω-fmap-ap-pres : {f* g* : X₁ ⊙→ X₂} (H : f* ⊙-crd∼ g*)
    → ap Loop2Grp-map (⊙-crd∼-to-== H) == natiso2G-to-== (Loop2Grp-map-ap H)
  Ω-fmap-ap-pres {f*} =
    ⊙hom-ind f*
      (λ g* H → ap Loop2Grp-map (⊙-crd∼-to-== H) == natiso2G-to-== (Loop2Grp-map-ap H))
      (ap (ap Loop2Grp-map) (⊙-crd∼-to-==-β f*) ∙
      ! (ap natiso2G-to-== (Loop2Grp-map-ap-β f*) ∙ natiso2G-to-==-β (Loop2Grp-map f*)))