fast_select

Struct FastSelect

Source
pub struct FastSelect { /* private fields */ }
Expand description

An object that can be used to efficiently select over alternative futures.

This allocates storage used by calls to select. Be careful to preallocate any instances of this outside the hot path.

§Example

let mut fast_select = FastSelect::new();
let (_cancel_send, mut cancel_recv) = unbounded::<()>();
loop {
    let operation = async {
        Some(5)
    };
    let cancelled = async {
        let _ = cancel_recv.next().await;
        None
    };
    if let Some(value) = fast_select.select((operation, cancelled)).await {
        break value;
    }
}

In cases where one future is much more common than the others, you can leave that future out and use a traditional select macro or function to select between the common future and the tuple with the remaining futures. This may even be a tuple of length one. In this case, the common future will be polled every iteration, while the uncommon futures will be only polled as necessary.

For example:

let mut fast_select = FastSelect::new();
futures::select_biased! {
    value = async { 5u32 }.fuse() => {
        println!("{}", value);
    }
    _ = fast_select.select((pending::<u32>(),)).fuse() => {
        unreachable!()
    }
}

Implementations§

Source§

impl FastSelect

Source

pub fn new() -> Self

Creates a new FastSelect.

Source

pub async fn select<T: Select>(&mut self, futures: T) -> T::Output

Selects between the futures in tuple futures.

Returns the output of the first one that completes. All the other futures are dropped without being completed.

The futures are polled in the order they are specified in the tuple, so there is a bias for earlier ones in the tuple.

Trait Implementations§

Source§

impl Debug for FastSelect

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FastSelect

Source§

fn default() -> FastSelect

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.