func select_recv<T, U>(a: &Receiver<T>, b: &Receiver<U>) -> Either<T?, U?>Race two receivers: the first ready side wins, ties go left, and a closed channel counts as ready (its receive is none). The losing side's value stays queued for a later receive.
View Source
pub func select_recv<T, U>(a: &Receiver<T>, b: &Receiver<U>) -> Either<T?, U?> {
loop {
if _chan_ctl(handle: a.handle, op: 0) != 1 {
return Either.left(a.recv())
}
if _chan_ctl(handle: b.handle, op: 0) != 1 {
return Either.right(b.recv())
}
'wait(reasons: [WaitReason.recv(a.handle), WaitReason.recv(b.handle)])
}
}