Cancelable Spawned Coroutines
Module — 2 files
These files compile together (same module folder).
file_1.verse
using { /Verse.org/Concurrency }
SpawnRoutine<public>(Func : type{_()<suspends>:void}):routine =
Routine := routine{Func := Func}
Routine.Start()
return Routine
routine<public> := class():
Func<public> : type{_()<suspends>:void}
Event<protected> : event() = event(){}
var MaybeTask<protected> : ?task(void) = false
var _IsRunning<protected> : logic = false
Start<internal>():void =
Task := spawn {RunRoutine()}
set MaybeTask = option {Task}
RunRoutine<protected>()<suspends>: void =
set _IsRunning = true
race:
Func()
Event.Await()
set _IsRunning = false
Cancel<public>():void = Event.Signal()
GetTask<public>()<decides><transacts>:task(void) = MaybeTask?
IsRunning<public>()<decides><transacts>:void = _IsRunning?
Sign in to download module
Copy-paste each file above is always free.