If multiple nested scopes are an issue, would using variadic generics be an option?
await withCancellationReasons(.timeout(.seconds(30)), .resourceLimit(.memory(1GB))) { timeout, resourceLimit in
try await process()
switch (timeout.reason, resourceLimit.reason) {
case (let timeout?, _):
// timed out
case (nil, let resourceLimit?):
// resource limit
}
}