Skip to Content
i documentation
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