------------------------------------------------------------------------ -- The delay monad, defined coinductively, with a sized type parameter ------------------------------------------------------------------------ {-# OPTIONS --without-K #-} module Delay-monad.Sized where open import Prelude -- The delay monad. mutual Delay : ∀ {a} → (Size → Set a) → Size → Set a Delay A i = A i ⊎ ∞Delay A i record ∞Delay {a} (A : Size → Set a) (i : Size) : Set a where coinductive field force : {j : Size< i} → Delay A j open ∞Delay public pattern now x = inj₁ x pattern later x = inj₂ x module _ {a} {A : Size → Set a} where mutual -- A non-terminating computation. never : ∀ {i} → Delay A i never = later ∞never ∞never : ∀ {i} → ∞Delay A i force ∞never = never