module Cubical.Data.FinSequence.Properties where

open import Cubical.Foundations.Prelude
open import Cubical.Data.Nat
open import Cubical.Data.Fin.Base
open import Cubical.Data.FinSequence.Base
open import Cubical.Data.Sequence


private
  variable
    ℓ ℓ' ℓ'' : Level

open Sequence
open FinSequence
open FinSequenceMap

idFinSequenceMap : (m : ℕ) (C : FinSequence m ℓ) → FinSequenceMap C C
fmap (idFinSequenceMap m C) p x = x
fcomm (idFinSequenceMap m C) p _ = refl

composeFinSequenceMap : (m : ℕ) {C : FinSequence m ℓ} {D : FinSequence m ℓ'}
  {E : FinSequence m ℓ''}
  (g : FinSequenceMap D E) (f : FinSequenceMap C D) → FinSequenceMap C E
fmap (composeFinSequenceMap m g f) n x = fmap g n (fmap f n x)
fcomm (composeFinSequenceMap m g f) n x =
    fcomm g n _
  ∙ cong (fmap g (fsuc n)) (fcomm f n x)

Sequence→FinSequence : (m : ℕ) → Sequence ℓ → FinSequence m ℓ
fobj (Sequence→FinSequence m C) x = obj C (fst x)
fmap (Sequence→FinSequence m C) x = map C x

SequenceMap→FinSequenceMap : (m : ℕ) (C D : Sequence ℓ)
  → SequenceMap C D
  → FinSequenceMap (Sequence→FinSequence m C) (Sequence→FinSequence m D)
fmap (SequenceMap→FinSequenceMap m C D ϕ) t = SequenceMap.map ϕ  (fst t)
fcomm (SequenceMap→FinSequenceMap m C D ϕ) t = SequenceMap.comm ϕ (fst t)