{-# OPTIONS --safe --sized-types #-} module Generic.Cofinite where open import Size open import Data.Unit open import Data.List.Base hiding (unfold) open import Data.Var using (_─Scoped) open import Data.Environment open import Generic.Syntax open import Generic.Semantics open import Generic.Semantics.Syntactic private variable I : Set s : Size Const : (I → Set) → List I → I ─Scoped Const T Δ j Γ = T j record ∞Tm (d : Desc I) (s : Size) (i : I) : Set where coinductive; constructor `con field force : {s' : Size< s} → ⟦ d ⟧ (Const (∞Tm d s')) i [] open ∞Tm public module _ {d : Desc ⊤} where plug : TM d tt → ∀ Δ i → Scope (Tm d ∞) Δ i [] → TM d i plug t Δ i = Semantics.semantics Sub (pack (λ _ → t)) unroll : TM d tt → ⟦ d ⟧ (Const (TM d)) tt [] unroll t@(`con b) = fmap d (plug t) b unfold : TM d tt → ∞Tm d s tt unfold t .force = fmap d (λ _ _ → unfold) (unroll t)