[][src]Macro ndless_async::first

macro_rules! first {
    ($( $arg:expr ),*) => { ... };
}

Polls for the first future to complete, and then cancels the remaining ones. If you care about the return value, use select. This macro must be used in an async context, such as an async fn or async { } block.

FuturesUnordered can be more flexible and efficient than this macro when you have many Futures or need to dynamically add and remove them.

Example

The call to block_on completes after 5 seconds or when the escape key is pressed, whichever comes first.

In reality, you should use TimerListener::timeout for this purpose. However, first! can be used for other, more complex cases.

use ndless_async::task::{AsyncListeners, block_on};
use ndless_async::StreamExt;
use ndless::input::Key;

let listeners = AsyncListeners::new();
block_on(&listeners, async { first!(timeout(&listeners), listen_for_esc(&listeners)) });


async fn timeout(listeners: &AsyncListeners) {
    listeners.timer().sleep_ms(5000).await;
}

async fn listen_for_esc(listeners: &AsyncListeners) {
    let mut keypad = listeners.keypad();
    while let Some(event) = keypad.next().await {
        if event.key == Key::Esc {
            break;
        }
    }
}