Skip to content

Instantly share code, notes, and snippets.

@MattRix
Last active April 22, 2023 14:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MattRix/45e3a2476d00c971f769e14268d4a70d to your computer and use it in GitHub Desktop.
Save MattRix/45e3a2476d00c971f769e14268d4a70d to your computer and use it in GitHub Desktop.
Cancelable Spawned Coroutines in Verse (advanced version)
<#> Usage
MyRoutine := SpawnRoutine(SomeLongRunningTask)
MyRoutine.Cancel()
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 up for free to join this conversation on GitHub. Already have an account? Sign in to comment