Guard a positional parameter in M.callWhen, awaiting it and matching its
fulfillment against the provided pattern.
For example, M.callWhen(M.await(M.nat())).returns() will await the first
argument, check that its fulfillment satisfies M.nat(), and only then call
the guarded method with that fulfillment. If the argument is a non-promise
value that already satisfies M.nat(), then the result of awaiting it will
still pass, and M.callWhen will still delay the guarded method call to a
future turn.
If the argument is a promise that rejects rather than fulfills, or if its
fulfillment does not satisfy the nested pattern, then the call is rejected
without ever invoking the guarded method.
Any AwaitArgGuard may not appear as a rest pattern or a result pattern,
only a top-level single parameter pattern.
Guard a synchronous call. Arguments not guarded by M.raw() are
automatically hardened and must be at least Passable.
Guard an async call. Arguments not guarded by M.raw() are automatically
hardened and must be at least Passable.
Guard the interface of an exo object.
In parameter position, pass this argument through without any hardening or checking. In rest position, pass the rest of the arguments through without any hardening or checking. In return position, return the result without any hardening or checking.
Makers for guards: interface, call/callWhen, await, and raw passthrough.