{-# OPTIONS --sized-types #-}

module A201605.AbelChapmanExtended.Convergence where

open import Data.Product using (∃)
open import Size using (Size ; Size<_ ; ∞)

open import A201605.AbelChapmanExtended.Delay
open import A201605.AbelChapmanExtended.StrongBisimilarity




data _⇓_ {A} : Delay ∞ A → A → Set where
  ⇓now   : ∀ {a}                                       → now a    ⇓ a
  ⇓later : ∀ {a} {a∞ : ∞Delay ∞ A} (a⇓ : force a∞ ⇓ a) → later a∞ ⇓ a

_⇓ : ∀ {A} → Delay ∞ A → Set
a? ⇓ = ∃ λ a → a? ⇓ a


⇓map : ∀ {A B a} {a? : Delay ∞ A} (f : A → B) → a? ⇓ a → (f <$> a?) ⇓ f a
⇓map f ⇓now        = ⇓now
⇓map f (⇓later ⇓a) = ⇓later (⇓map f ⇓a)


⇓≈subst : ∀ {A a} {a? a?′ : Delay ∞ A} → a? ⇓ a → a? ≈ a?′ → a?′ ⇓ a
⇓≈subst ⇓now        (≈now a)   = ⇓now
⇓≈subst (⇓later ⇓a) (≈later p) = ⇓later (⇓≈subst ⇓a (≈force p))


⇓bind : ∀ {A B a b} {a? : Delay ∞ A} {f : A → Delay ∞ B} →
        a? ⇓ a → f a ⇓ b → (a? >>= f) ⇓ b
⇓bind ⇓now        ⇓b = ⇓b
⇓bind (⇓later ⇓a) ⇓b = ⇓later (⇓bind ⇓a ⇓b)