select_recv

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)])
	}
}