123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122module Network.DelayedDiffuse (Participants : ℕ) (Message : Type) (Δ : ℕ) ⦃ _ : DecEq Message ⦄ whereunquoteDecl DecEq-BufferedMessage = derive-DecEq ((quote BufferedMessage , DecEq-BufferedMessage) ∷ [])newMessages = fromList (concatMap (λ m → tabulate (λ r → record { sender = sender ; recipient = r ; m = m ; round = round })) ms)return just $ L⊗ (ϵ ⊗R) ᵗ¹ ↑ᵢ app (⨂⇒ p) (Deliver (s .inbox p)) -- deliver all messages in the inboxnewState record (bufferMessages p ms s) { done = s .done ∪ ❴ p ❵ } -- buffer a copy of every message for every participant & mark p as done∀[ m ∈ s .buffer ] m .round + Δ ≥ s .round → -- the adversary has delivered all sufficiently old messages