{-# OPTIONS --safe #-}
module Multiset.Util.Trace where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Isomorphism
renaming (Iso to _≅_)
open import Cubical.Foundations.Function
using (const)
open import Cubical.Foundations.Path
using (flipSquare)
open import Cubical.Data.Nat
open import Cubical.Data.Sigma
renaming
( fst to step
; snd to connect
) public
private
variable
ℓ : Level
A : Type ℓ
Trace : Type ℓ → Type ℓ
Trace A = Σ[ as ∈ (ℕ → A) ] (∀ n → as n ≡ as (suc n))
constTrace : A → Trace A
constTrace a = const a , const refl
module _ (trace : Trace A) where
as = trace .step
is-link = trace .connect
to0 : ∀ n → as 0 ≡ as n
to0 0 = refl
to0 (suc n) = to0 n ∙ is-link n
constTraceConnectSquare : ∀ n → PathP (λ i → to0 n i ≡ (to0 n ∙ is-link n) i) refl (is-link n)
constTraceConnectSquare n = flipSquare filler where
filler : PathP (λ j → as 0 ≡ is-link n j) (to0 n) (to0 n ∙ is-link n)
filler = compPath-filler (to0 n) (is-link n)
constTracePath : constTrace (as 0) ≡ (as , is-link)
constTracePath = ΣPathP (funExt to0 , funExt constTraceConnectSquare)
start : Trace A → A
start trace = trace .step 0
open _≅_
TraceIso : Trace A ≅ A
TraceIso .fun = start
TraceIso .inv = constTrace
TraceIso .leftInv = constTracePath
TraceIso .rightInv a = refl