DoubleEndedStream in async_std::stream - Rust (original) (raw)

Trait DoubleEndedStream

Source

pub trait DoubleEndedStream: Stream {
    // Required method
    fn poll_next_back(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>,
    ) -> Poll<Option<Self::Item>>;

    // Provided methods
    fn next_back(&mut self) -> NextBackFuture<'_, Self>
       where Self: Unpin { ... }
    fn nth_back(&mut self, n: usize) -> NthBackFuture<'_, Self>
       where Self: Unpin + Sized { ... }
    fn rfind<P>(&mut self, p: P) -> RFindFuture<'_, Self, P>
       where Self: Unpin + Sized,
             P: FnMut(&Self::Item) -> bool { ... }
    fn rfold<B, F>(self, accum: B, f: F) -> RFoldFuture<Self, F, B>
       where Self: Sized,
             F: FnMut(B, Self::Item) -> B { ... }
    fn try_rfold<B, F, E>(self, accum: B, f: F) -> TryRFoldFuture<Self, F, B>
       where Self: Sized,
             F: FnMut(B, Self::Item) -> Result<B, E> { ... }
}

Available on unstable only.

Expand description

A stream able to yield elements from both ends.

Something that implements DoubleEndedStream has one extra capability over something that implements Stream: the ability to also takeItems from the back, as well as the front.

Source

Attempts to receive the next item from the back of the stream.

There are several possible return values:

§Examples
use std::pin::Pin;

use async_std::prelude::*;
use async_std::stream;
use async_std::task::{Context, Poll};

fn increment(
    s: impl DoubleEndedStream<Item = i32> + Unpin,
) -> impl DoubleEndedStream<Item = i32> + Unpin {
    struct Increment<S>(S);

    impl<S: DoubleEndedStream<Item = i32> + Unpin> Stream for Increment<S> {
        type Item = S::Item;

        fn poll_next(
            mut self: Pin<&mut Self>,
            cx: &mut Context<'_>,
        ) -> Poll<Option<Self::Item>> {
            match Pin::new(&mut self.0).poll_next(cx) {
                Poll::Pending => Poll::Pending,
                Poll::Ready(None) => Poll::Ready(None),
                Poll::Ready(Some(item)) => Poll::Ready(Some(item + 1)),
            }
        }
    }

    impl<S: DoubleEndedStream<Item = i32> + Unpin> DoubleEndedStream for Increment<S> {
        fn poll_next_back(
            mut self: Pin<&mut Self>,
            cx: &mut Context<'_>,
        ) -> Poll<Option<Self::Item>> {
            match Pin::new(&mut self.0).poll_next_back(cx) {
                Poll::Pending => Poll::Pending,
                Poll::Ready(None) => Poll::Ready(None),
                Poll::Ready(Some(item)) => Poll::Ready(Some(item + 1)),
            }
        }
    }

    Increment(s)
}

let mut s = increment(stream::once(7));

assert_eq!(s.next_back().await, Some(8));
assert_eq!(s.next_back().await, None);

Source

Advances the stream and returns the next value.

Returns None when iteration is finished. Individual stream implementations may choose to resume iteration, and so calling next() again may or may not eventually start returning more values.

§Examples
use async_std::prelude::*;
use async_std::stream;

let mut s = stream::from_iter(vec![7u8]);

assert_eq!(s.next_back().await, Some(7));
assert_eq!(s.next_back().await, None);

Source

Returns the nth element from the back of the stream.

§Examples

Basic usage:

use async_std::prelude::*;
use async_std::stream;

let mut s = stream::from_iter(vec![1u8, 2, 3, 4, 5]);

let second = s.nth_back(1).await;
assert_eq!(second, Some(4));

Source

Returns the first element from the right that matches the predicate.

§Examples

Basic usage:

use async_std::prelude::*;
use async_std::stream;

let mut s = stream::from_iter(vec![1u8, 2, 3, 4, 5]);

let second = s.rfind(|v| v % 2 == 0).await;
assert_eq!(second, Some(4));

Source

§Examples

Basic usage:

use async_std::prelude::*;
use async_std::stream;

let s = stream::from_iter(vec![1u8, 2, 3, 4, 5]);

let second = s.rfold(0, |acc, v| v + acc).await;

assert_eq!(second, 15);

Source

A combinator that applies a function as long as it returns successfully, producing a single, final value. Immediately returns the error when the function returns unsuccessfully.

§Examples

Basic usage:

use async_std::prelude::*;
use async_std::stream;

let s = stream::from_iter(vec![1u8, 2, 3, 4, 5]);
let sum = s.try_rfold(0, |acc, v| {
    if (acc+v) % 2 == 1 {
        Ok(v+3)
    } else {
        Err("fail")
    }
}).await;

assert_eq!(sum, Err("fail"));

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Source§

Source§

Source§