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

open import lib.Basics
open import 2Grp
open import 2GrpPropsMap
open import 2GrpHom3
open import 2GrpHom4

module 2GrpHom5 where

open CohGrp {{...}}

module _ {i j} {G₁ : Type i} {G₂ : Type j} {{η₁ : CohGrp G₁}} {{η₂ : CohGrp G₂}}
  (map : G₁  G₂)
  (map-comp : (x y : G₁)  mu (map x) (map y) == map (mu x y))
  (map-al : (x y z : G₁) 
    ! (al (map x) (map y) (map z)) ◃∙
    ap (mu (map x)) (map-comp y z) ◃∙
    map-comp x (mu y z) ◃∎
      =ₛ
    ap  v  mu v (map z)) (map-comp x y) ◃∙
    map-comp (mu x y) z ◃∙
    ! (ap map (al x y z)) ◃∎)
  (map-id : id == map id)
  (map-rho-id :
    ! (map-comp id id) ◃∎
      =ₛ
    ap map (rho id) ◃∙
    ! (rho (map id)) ◃∙
    ap (mu (map id)) map-id ◃∎) where

  private
  
    map-inv : (x : G₁)  inv (map x) == map (inv x)
    map-inv x =
      ! (al (inv (map x)) (map x) (inv (map x)) 
        ap2 mu (linv (map x)) idp 
        lam (inv (map x))) 
      ap (mu (inv (map x)))
        (! (rinv (map x))  map-id  ap map (rinv x)  ! (map-comp x (inv x))) 
      al (inv (map x)) (map x) (map (inv x)) 
      ap2 mu (linv (map x)) idp 
      lam (map (inv x))
      
    map-rinv : (x : G₁) 
      ! (ap (mu (map x)) (map-inv x)) ◃∎
        =ₛ
      map-comp x (inv x) ◃∙
      ! (ap map (rinv x)) ◃∙
      ! map-id ◃∙
      rinv (map x) ◃∎
    map-rinv x = !ₛ (map-inv-map-rinv map map-comp map-id map-inv x (=ₛ-in idp))

  module _ (x : G₁) where

    open MapUnit0 map map-comp map-inv map-id map-al x
    open MapUnit1 map map-comp map-inv map-id map-rinv map-rho-id x

    abstract
      rho-to-lam-aux :
        ! (! (al id (map x) (inv (map x))) 
          ! (ap (mu id) (rinv (map x))) 
          rho id) ◃∙
        ap  z  mu z (inv (map x))) (
          lam (map x) 
          ! (ap map (lam x)) 
          ! (map-comp id x)) ◃∙
        ! (al (map id) (map x) (inv (map x))) ◃∙
        ! (ap (mu (map id)) (rinv (map x))) ◃∙
        rho (map id) ◃∎
          =ₛ
        map-id ◃∎
      rho-to-lam-aux =
        rho-to-lam0 ∙ₛ rho-to-lam1 ∙ₛ rho-to-lam2 ∙ₛ rho-to-lam3 ∙ₛ rho-to-lam4 ∙ₛ rho-to-lam5

    abstract
      rho-to-lam :
        ! (ap map (lam x)) ◃∙
        ! (map-comp id x) ◃∙
        ! (ap  z  mu z (map x)) map-id) ◃∎
          =ₛ
        ! (lam (map x)) ◃∎
      rho-to-lam = map-id-map-lam map map-comp map-id x (!ₛ rho-to-lam-aux)