Subscribable Event
Module — 2 files
These files compile together (same module folder).
file_1.verse
using { /Verse.org/Concurrency }
subscribable_event<public>(t:type) := class(subscribable(t), signalable(t)):
var Callbacks<private>:[]tuple(type{_(:t):void}, int) = array{}
var NextID<private>:int = 0
Signal<override>(Payload:t):void =
for (Callback : Callbacks) do Callback(0)(Payload)
Subscribe<override>(Callback:type{_(:t):void})<transacts>:cancelable =
ID := NextID
set NextID += 1
set Callbacks += array{(Callback, ID)}
return basic_cancelable:
ID := ID
CancelCallback := CancelSubscription
CancelAllSubscriptions<public>()<transacts>:void =
set Callbacks = array{}
CancelSubscription<private>(ID:int)<transacts>:void =
set Callbacks = for (Callback : Callbacks, Callback(1) <> ID) do Callback
listenable_event<public>(t:type) := class(subscribable_event(t), listenable(t)):
Event<private>:event(t) = event(t){}
Await<override>()<suspends>:t = Event.Await()
Signal<override>(Payload:t):void =
(super:)Signal(Payload)
Event.Signal(Payload)
basic_cancelable<internal> := class(cancelable):
ID<internal>:int
CancelCallback<internal>:type{_(:int)<transacts>:void}
Cancel<override>()<transacts>:void =
CancelCallback(ID)
Sign in to download module
Copy-paste each file above is always free.