macro_rules! select {
    ($($tokens:tt)*) => { ... };
}
Expand description

Select multiple selectables simultaneously for reading and writing

select! supports four different clauses:

  • pattern = <-reader[, if condition] => code,
  • pattern = writer<-expression[, if condition] => code,
  • default => code,
  • complete => code,

Restrictions

  • reader and writer must be mut idents but not expressions.
  • pattern must be irrefutable.

Evaluation

  • All conditions are evaluated before selection.
  • Expressions to writer are only evaluated if that branch is selected.
  • complete case is run if all selectables are disabled or completed.
  • default case is run if no selectable is ready, or all selectables are disabled or completed in absent of complete.

Panics

  • Panic when all selectables are disabled or completed and there is no default or complete.

Examples

use stuck::channel::serial;
use stuck::select;

#[stuck::main]
fn main() {
    let (mut sender, mut receiver) = serial::bounded(1);
    let mut sent = false;
    let mut received = false;
    loop {
        select! {
            _ = <-receiver => received = true,
            _ = sender<-1, if !sent  => sent = true,
            default => break,
        }
    }
    assert!(sent);
    assert!(received);
}