{-# OPTIONS --safe #-}

module Cubical.Cohomology.EilenbergMacLane.Groups.Unit where

open import Cubical.Cohomology.EilenbergMacLane.Base
open import Cubical.Cohomology.EilenbergMacLane.Groups.Connected

open import Cubical.Homotopy.EilenbergMacLane.Base
open import Cubical.Homotopy.EilenbergMacLane.Properties
open import Cubical.Homotopy.Connected

open import Cubical.Foundations.Prelude
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Isomorphism

open import Cubical.Data.Nat

open import Cubical.Algebra.Group.MorphismProperties
open import Cubical.Algebra.AbGroup.Base

open import Cubical.HITs.SetTruncation as ST
open import Cubical.HITs.Truncation as Trunc

open import Cubical.Data.Unit

H⁰[Unit,G]≅G :  {} {G : AbGroup }
   AbGroupEquiv (coHomGr 0 G Unit) G
H⁰[Unit,G]≅G {G = G} = H⁰conn isConnectedUnit G
  where
  isConnectedUnit : isConnected 2 Unit
  fst isConnectedUnit =  tt 
  snd isConnectedUnit = Trunc.elim  _  isOfHLevelPath 2 (isOfHLevelTrunc 2) _ _)
                        λ _  refl

isContr-Hⁿ⁺¹[Unit,G] :  {} {G : AbGroup } (n : )
   isContr (coHom (suc n) G Unit)
fst (isContr-Hⁿ⁺¹[Unit,G] {G = G} n) = 0ₕ (suc n)
snd (isContr-Hⁿ⁺¹[Unit,G] {G = G} n) =
  ST.elim  _  isSetPathImplicit)
    λ f  Trunc.rec
      (isProp→isOfHLevelSuc n (squash₂ _ _))
       p  cong ∣_∣₂ (funExt λ _  p))
      (isConnectedPath (suc n)
        (isConnectedEM (suc n)) (0ₖ (suc n)) (f tt) .fst)

Hⁿ⁺¹[Unit,G]≅0 :  {} {G : AbGroup } (n : )
   AbGroupEquiv (coHomGr (suc n) G Unit) (trivialAbGroup { = })
fst (Hⁿ⁺¹[Unit,G]≅0 {G = G} n) = isoToEquiv (isContr→Iso (isContr-Hⁿ⁺¹[Unit,G] n) isContrUnit*)
snd (Hⁿ⁺¹[Unit,G]≅0 n) = makeIsGroupHom λ _ _  refl