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

open import lib.Basics
open import lib.types.Pointed

-- preservation of groupoid structure by ⊙-crd∼-to-==

module lib.types.PtdMap-conv where

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

  abstract

    !⊙-conv : {f₁ f₂ : X ⊙→ Y} (h : f₁ ⊙-crd∼ f₂) 
      ⊙-crd∼-to-== (!-⊙∼ h) == ! (⊙-crd∼-to-== h)
    !⊙-conv {f₁} = 
      ⊙hom-ind f₁
         f₂ h  ⊙-crd∼-to-== (!-⊙∼ h) == ! (⊙-crd∼-to-== h))
        (ap ⊙-crd∼-to-== (∙⊙∼-! f₁) 
        ⊙-crd∼-to-==-β f₁ 
        ap ! (! (⊙-crd∼-to-==-β f₁)))

    ⊙∘-conv : {f₁ f₃ f₂ : X ⊙→ Y} (h₁ : f₁ ⊙-crd∼ f₂) (h₂ : f₂ ⊙-crd∼ f₃) 
      ⊙-crd∼-to-== (h₁ ∙⊙∼ h₂) ◃∎ =ₛ ⊙-crd∼-to-== h₁ ◃∙ ⊙-crd∼-to-== h₂ ◃∎
    ⊙∘-conv {f₁} {f₃} =
      ⊙hom-ind f₁
         f₂ h₁ 
          ((h₂ : f₂ ⊙-crd∼ f₃) 
            ⊙-crd∼-to-== (h₁ ∙⊙∼ h₂) ◃∎ =ₛ ⊙-crd∼-to-== h₁ ◃∙ ⊙-crd∼-to-== h₂ ◃∎))
        λ h₂  
          ⊙-crd∼-to-== (⊙∼-id f₁ ∙⊙∼ h₂) ◃∎
            =ₛ₁⟨ ap ⊙-crd∼-to-== (∙⊙∼-unit-l h₂) 
          ⊙-crd∼-to-== h₂ ◃∎
            =ₛ⟨ =ₛ-in (idp {a = ⊙-crd∼-to-== h₂}) 
          idp {a = f₁} ◃∙ ⊙-crd∼-to-== h₂ ◃∎
            =ₛ₁⟨ 0 & 1 & ! (⊙-crd∼-to-==-β f₁) 
          ⊙-crd∼-to-== (⊙∼-id f₁) ◃∙ ⊙-crd∼-to-== h₂ ◃∎ ∎ₛ
          
    ⊙∘-conv-tri : {f₁ f₂ f₃ f₄ : X ⊙→ Y}
      (h₁ : f₁ ⊙-crd∼ f₂) (h₂ : f₂ ⊙-crd∼ f₃) (h₃ : f₃ ⊙-crd∼ f₄) 
      ⊙-crd∼-to-== (h₁ ∙⊙∼ h₂ ∙⊙∼ h₃) ◃∎
        =ₛ
      ⊙-crd∼-to-== h₁ ◃∙ ⊙-crd∼-to-== h₂ ◃∙ ⊙-crd∼-to-== h₃ ◃∎
    ⊙∘-conv-tri h₁ h₂ h₃ =
      ⊙-crd∼-to-== (h₁ ∙⊙∼ h₂ ∙⊙∼ h₃) ◃∎
        =ₛ⟨ ⊙∘-conv h₁  (h₂ ∙⊙∼ h₃) 
      ⊙-crd∼-to-== h₁ ◃∙ ⊙-crd∼-to-== (h₂ ∙⊙∼ h₃) ◃∎
        =ₛ⟨ 1 & 1 & ⊙∘-conv h₂ h₃ 
      ⊙-crd∼-to-== h₁ ◃∙ ⊙-crd∼-to-== h₂ ◃∙ ⊙-crd∼-to-== h₃ ◃∎ ∎ₛ

    ⊙∘-conv-quint : {f₁ f₂ f₃ f₄ f₅ f₆ : X ⊙→ Y}
      (h₁ : _⊙-crd∼_ f₁ f₂) (h₂ : _⊙-crd∼_ f₂ f₃)
      (h₃ : _⊙-crd∼_ f₃ f₄) (h₄ : _⊙-crd∼_ f₄ f₅)
      (h₅ : _⊙-crd∼_ f₅ f₆) 
      ⊙-crd∼-to-== h₁ ◃∙
      ⊙-crd∼-to-== h₂ ◃∙
      ⊙-crd∼-to-== h₃ ◃∙
      ⊙-crd∼-to-== h₄ ◃∙
      ⊙-crd∼-to-== h₅ ◃∎ 
        =ₛ
      ⊙-crd∼-to-== (h₁ ∙⊙∼ h₂ ∙⊙∼ h₃ ∙⊙∼ h₄ ∙⊙∼ h₅) ◃∎
    ⊙∘-conv-quint h₁ h₂ h₃ h₄ h₅ = 
      ⊙-crd∼-to-== h₁ ◃∙
      ⊙-crd∼-to-== h₂ ◃∙
      ⊙-crd∼-to-== h₃ ◃∙
      ⊙-crd∼-to-== h₄ ◃∙
      ⊙-crd∼-to-== h₅ ◃∎
        =ₛ⟨ 2 & 3 & !ₛ (⊙∘-conv-tri h₃ h₄ h₅) 
      ⊙-crd∼-to-== h₁ ◃∙
      ⊙-crd∼-to-== h₂ ◃∙
      ⊙-crd∼-to-== (h₃ ∙⊙∼ h₄ ∙⊙∼ h₅) ◃∎
        =ₛ⟨ !ₛ (⊙∘-conv-tri h₁ h₂ (h₃ ∙⊙∼ h₄ ∙⊙∼ h₅)) 
      ⊙-crd∼-to-== (h₁ ∙⊙∼ h₂ ∙⊙∼ h₃ ∙⊙∼ h₄ ∙⊙∼ h₅) ◃∎ ∎ₛ

    ⊙∘-conv-sept : {f₁ f₂ f₃ f₄ f₅ f₆ f₇ f₈ : X ⊙→ Y}
      (h₁ : _⊙-crd∼_ f₁ f₂) (h₂ : _⊙-crd∼_ f₂ f₃)
      (h₃ : _⊙-crd∼_ f₃ f₄) (h₄ : _⊙-crd∼_ f₄ f₅)
      (h₅ : _⊙-crd∼_ f₅ f₆) (h₆ : _⊙-crd∼_ f₆ f₇)
      (h₇ : _⊙-crd∼_ f₇ f₈) 
      ⊙-crd∼-to-== h₁ ◃∙
      ⊙-crd∼-to-== h₂ ◃∙
      ⊙-crd∼-to-== h₃ ◃∙
      ⊙-crd∼-to-== h₄ ◃∙
      ⊙-crd∼-to-== h₅ ◃∙
      ⊙-crd∼-to-== h₆ ◃∙
      ⊙-crd∼-to-== h₇ ◃∎
        =ₛ
      ⊙-crd∼-to-== (h₁ ∙⊙∼ h₂ ∙⊙∼ h₃ ∙⊙∼ h₄ ∙⊙∼ h₅ ∙⊙∼ h₆ ∙⊙∼ h₇) ◃∎
    ⊙∘-conv-sept h₁ h₂ h₃ h₄ h₅ h₆ h₇ = 
      ⊙-crd∼-to-== h₁ ◃∙
      ⊙-crd∼-to-== h₂ ◃∙
      ⊙-crd∼-to-== h₃ ◃∙
      ⊙-crd∼-to-== h₄ ◃∙
      ⊙-crd∼-to-== h₅ ◃∙
      ⊙-crd∼-to-== h₆ ◃∙
      ⊙-crd∼-to-== h₇ ◃∎
        =ₛ⟨ 2 & 5 & ⊙∘-conv-quint h₃ h₄ h₅ h₆ h₇ 
      ⊙-crd∼-to-== h₁ ◃∙
      ⊙-crd∼-to-== h₂ ◃∙
      ⊙-crd∼-to-== (h₃ ∙⊙∼ h₄ ∙⊙∼ h₅ ∙⊙∼ h₆ ∙⊙∼ h₇) ◃∎
        =ₛ⟨ !ₛ (⊙∘-conv-tri h₁ h₂ (h₃ ∙⊙∼ h₄ ∙⊙∼ h₅ ∙⊙∼ h₆ ∙⊙∼ h₇)) 
      ⊙-crd∼-to-== (h₁ ∙⊙∼ h₂ ∙⊙∼ h₃ ∙⊙∼ h₄ ∙⊙∼ h₅ ∙⊙∼ h₆ ∙⊙∼ h₇) ◃∎ ∎ₛ

module _ {i j k} {X : Ptd i} {Y : Ptd j} {Z : Ptd k} where

  abstract

    whisk⊙-conv-r : {f₁ : X ⊙→ Y} {f₂ f₂' : Y ⊙→ Z} (h : f₂ ⊙-crd∼ f₂') 
      ⊙-crd∼-to-== (⊙∘-pre f₁ h) == ap  m  m ⊙∘ f₁) (⊙-crd∼-to-== h)
    whisk⊙-conv-r {f₁} {f₂} =
      ⊙hom-ind f₂
         f₂' h  ⊙-crd∼-to-== (⊙∘-pre f₁ h) == ap  m  m ⊙∘ f₁) (⊙-crd∼-to-== h))
        (ap ⊙-crd∼-to-== (∙⊙-pre {f = f₂}) 
        ⊙-crd∼-to-==-β (f₂ ⊙∘ f₁) 
        ! (ap (ap  m  m ⊙∘ f₁)) (⊙-crd∼-to-==-β f₂)))

    whisk⊙-conv-l : {f₁ : Y ⊙→ Z} {f₂ f₂' : X ⊙→ Y} (h : f₂ ⊙-crd∼ f₂') 
      ⊙-crd∼-to-== (⊙∘-post f₁ h) == ap  m  f₁ ⊙∘ m) (⊙-crd∼-to-== h)
    whisk⊙-conv-l {f₁} {f₂} = 
      ⊙hom-ind f₂
         f₂' h  ⊙-crd∼-to-== (⊙∘-post f₁ h) == ap  m  f₁ ⊙∘ m) (⊙-crd∼-to-== h))
        (ap ⊙-crd∼-to-== (∙⊙-post {f = f₂})  
        ⊙-crd∼-to-==-β (f₁ ⊙∘ f₂) 
        ! (ap (ap  m  f₁ ⊙∘ m)) (⊙-crd∼-to-==-β f₂)))

    ⊙-whisk⊙-conv-l-∙-aux : {f₁ : Y ⊙→ Z} {f₂ f₂' : X ⊙→ Y} (h : f₂ ⊙-crd∼ f₂') 
      ap (_⊙∘_ f₁) (⊙-crd∼-to-== (⊙∼-id f₂)  ⊙-crd∼-to-== h)
        ==
      ⊙-crd∼-to-== (⊙∘-post f₁ (⊙∼-id f₂ ∙⊙∼ h))
    ⊙-whisk⊙-conv-l-∙-aux {f₁@(_ , idp)} {f₂@(_ , idp)} =
      ⊙hom-ind f₂
         f₂' h 
          ap (_⊙∘_ f₁) (⊙-crd∼-to-== (⊙∼-id f₂)  ⊙-crd∼-to-== h)
            ==
          ⊙-crd∼-to-== (⊙∘-post f₁ (⊙∼-id f₂ ∙⊙∼ h)))
        (ap  p  ap (_⊙∘_ f₁) (p  p)) (⊙-crd∼-to-==-β f₂) 
        ! (ap ⊙-crd∼-to-== (⊙→∼-to-== ((λ _  idp) , idp ))  ⊙-crd∼-to-==-β _))

    ⊙-whisk⊙-conv-l-∙ : {f₁ : Y ⊙→ Z} {f₂ f₂'' f₂' : X ⊙→ Y} (h₁ : f₂ ⊙-crd∼ f₂') (h₂ : f₂' ⊙-crd∼ f₂'') 
      ap  m  f₁ ⊙∘ m) (⊙-crd∼-to-== h₁  ⊙-crd∼-to-== h₂)
        ==
      ⊙-crd∼-to-== (⊙∘-post f₁ (h₁ ∙⊙∼ h₂))
    ⊙-whisk⊙-conv-l-∙ {f₁} {f₂} {f₂''} =
      ⊙hom-ind f₂
         f₂' h₁  (h₂ : f₂' ⊙-crd∼ f₂'') 
          ap  m  f₁ ⊙∘ m) (⊙-crd∼-to-== h₁  ⊙-crd∼-to-== h₂)
            ==
          ⊙-crd∼-to-== (⊙∘-post f₁ (h₁ ∙⊙∼ h₂)))
        ⊙-whisk⊙-conv-l-∙-aux

    !⊙-whisk⊙-conv-l-∙ : {f₁ : Y ⊙→ Z} {f₂ f₂'' f₂' : X ⊙→ Y} (h₁ : f₂ ⊙-crd∼ f₂') (h₂ : f₂' ⊙-crd∼ f₂'') 
      ! (ap  m  f₁ ⊙∘ m) (⊙-crd∼-to-== h₁  ⊙-crd∼-to-== h₂))
        ==
      ⊙-crd∼-to-== (!-⊙∼ (⊙∘-post f₁ (h₁ ∙⊙∼ h₂)))
    !⊙-whisk⊙-conv-l-∙ {f₁} h₁ h₂ = ap ! (⊙-whisk⊙-conv-l-∙ h₁ h₂)  ! (!⊙-conv (⊙∘-post f₁ (h₁ ∙⊙∼ h₂)))