Standard library referenceModules
i/request
Typed requests, cancellation groups and replaceable waits (§9.11).
Await
Await = (wait = (Ticket) -> Nil) Root
Root = (key = Key(Nil)) Owner
Owner = (key = Key(Nil), root = Root) RequestState
RequestState(A) = Waiting | Ready(A) | Cancelled | Taken open_root
open_root = () <- (parent : Root) -> Root { Root(key = new_root(parent.key)) } close_root
close_root = (root : Root) { end_root(root.key) } open_owner
open_owner = () <- (root : Root) -> Owner { close_owner
close_owner = (owner : Owner) { end_owner(owner.key) } count
count = (owner : Owner) { group_count(owner.key) } count_root
count_root = (root : Root) { root_count(root.key) } settled_owner
settled_owner = (owner : Owner) { count(owner) == 0 } settled_root
settled_root = (root : Root) { count_root(root) == 0 } cancel_all
cancel_all = (owner : Owner) { cancel_group(owner.key) } cancel_all_root
cancel_all_root = (root : Root) { cancel_root(root.key) } wait_none
wait_none = (owner : Owner) { await_owned(observe_owner(owner.key)) } wait_none_root
wait_none_root = (root : Root) { await_owned(observe_root(root.key)) } within
within = (body) { ready
A fresh completed fake, with no group or host id.
ready : <A>(A) -> Request(A) ticket
ticket : <A>(Request(A)) -> Ticket state
state = <A>(r : Request(A)) -> RequestState(A) { take
take : <A>(Request(A)) -> A settled
settled : (Ticket) -> Bool cancel
cancel : (Ticket) -> Nil await
Borrows the producer; cancelling this waiter does not cancel its work.
await = (r) <- (waiter : Await) { await_owned
Owns a non-resource-producing operation through all exits.
await_owned = (r) { resource.ensure(() { await(r) }, () { cancel(ticket(r)) }) } wait_any
Waits through answers of unlisted requests; terminal tickets return now.
wait_any : (List(Ticket)) -> Nil poll
Gives the host a progress turn even when no request is outstanding.
poll : () -> Nil