Awaitable Utilities
using { /Verse.org/Concurrency }
using { /Verse.org/Simulation }
# Awaits the event and returns its payload or false if the timeout elapses first.
(Awaitable:awaitable(t) where t:type).AwaitWithTimeout<public>(TimeoutSeconds:float)<suspends>:?t =
race:
block:
Payload := Awaitable.Await()
return option{Payload}
Sleep(TimeoutSeconds)
return false
# Waits until the event is not signaled for the given timeout period.
(Awaitable:awaitable(any)).AwaitUntilIdle<public>(TimeoutSeconds:float)<suspends>:void =
loop:
race:
block:
Payload := Awaitable.Await()
block:
Sleep(TimeoutSeconds)
return
# Continuously awaits a matching signal and invokes provided callback using received payload.
(Awaitable:awaitable(t)).ListenAndCall<public>(Callback:type{_(:t):void} where t:type)<suspends>:void =
loop:
Payload := Awaitable.Await()
Callback(Payload)
# Continuously awaits a matching signal and invokes provided callback using custom payload.
(Awaitable:awaitable(any)).ListenAndCallUsing<public>(Callback:type{_(:t):void}, CustomPayload:t where t:type)<suspends>:void =
loop:
Awaitable.Await()
Callback(CustomPayload)
You're reading a preview
The full reference is free for BrainDeadGuild Discord members — sign in to read it all, or open the original at the source.
Sign in with your BrainDead.TV / BrainDeadGuild Discord account for full access.