{-
The unit type as a CW complex
-}
module Cubical.CW.Instances.Unit where

open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Univalence

open import Cubical.Data.Nat renaming (_+_ to _+ℕ_)
open import Cubical.Data.Fin.Inductive
open import Cubical.Data.Empty as 
open import Cubical.Data.Unit
open import Cubical.Data.Sequence.Base

open import Cubical.HITs.Pushout
open import Cubical.HITs.SequentialColimit
open import Cubical.HITs.PropositionalTruncation

open import Cubical.CW.Base

CWskelUnit* :  {}  CWskel 
fst CWskelUnit* zero = ⊥*
fst CWskelUnit* (suc n) = Unit*
fst (snd CWskelUnit*) zero = 1
fst (snd CWskelUnit*) (suc x) = 0
fst (snd (snd CWskelUnit*)) zero ()
fst (snd (snd CWskelUnit*)) (suc n) _ = tt*
snd (snd (snd (snd CWskelUnit*))) zero =
    compEquiv (compEquiv (compEquiv (invEquiv LiftEquiv)
    (isoToEquiv Iso-Unit-Fin1))
      (isoToEquiv (PushoutEmptyFam (λ()) λ()))) (symPushout _ _)
snd (snd (snd (snd CWskelUnit*))) (suc n) =
  isoToEquiv (PushoutEmptyFam (λ()) λ())

convergesCWskelUnit* :  {}  converges (realiseSeq (CWskelUnit* {})) 1
convergesCWskelUnit* zero = idIsEquiv _
convergesCWskelUnit* (suc k) = idIsEquiv _

hasFinCWskelUnit* :  {}  hasFinCWskel (Unit* {})
fst hasFinCWskelUnit* = 1
fst (fst (snd hasFinCWskelUnit*)) = CWskelUnit* .fst
fst (snd (fst (snd hasFinCWskelUnit*))) = CWskelUnit* .snd
snd (snd (fst (snd hasFinCWskelUnit*))) = convergesCWskelUnit*
fst (snd (snd hasFinCWskelUnit*)) = _
snd (snd (snd hasFinCWskelUnit*)) =
  converges→isEquivIncl {seq = realiseSeq CWskelUnit*} 1
    convergesCWskelUnit*

finCWUnit* : ( : Level)  finCW 
fst (finCWUnit* ) = Unit*
snd (finCWUnit* ) =  hasFinCWskelUnit* ∣₁

finCWUnit : finCW ℓ-zero
fst finCWUnit = Unit
snd finCWUnit = subst isFinCW (sym (ua Unit≃Unit*))  hasFinCWskelUnit* ∣₁