[][src]Trait vujio_server::DoubleEndedStream

pub trait DoubleEndedStream: Stream {
    pub fn poll_next_back(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>
    ) -> Poll<Option<Self::Item>>; pub fn next_back(&mut self) -> NextBackFuture<'_, Self>
    where
        Self: Unpin
, { ... }
pub fn nth_back(&mut self, n: usize) -> NthBackFuture<'_, Self>
    where
        Self: Unpin
, { ... }
pub fn rfind<P>(&mut self, p: P) -> RFindFuture<'_, Self, P>
    where
        Self: Unpin,
        P: FnMut(&Self::Item) -> bool
, { ... }
pub fn rfold<B, F>(self, accum: B, f: F) -> RFoldFuture<Self, F, B>
    where
        F: FnMut(B, Self::Item) -> B
, { ... }
pub fn try_rfold<B, F, E>(
        self,
        accum: B,
        f: F
    ) -> TryRFoldFuture<Self, F, B>
    where
        F: FnMut(B, Self::Item) -> Result<B, E>
, { ... } }

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 take Items from the back, as well as the front.

Required methods

pub fn poll_next_back(
    self: Pin<&mut Self>,
    cx: &mut Context<'_>
) -> Poll<Option<Self::Item>>
[src]

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

There are several possible return values:

  • Poll::Pending means this stream's next_back value is not ready yet.
  • Poll::Ready(None) means this stream has been exhausted.
  • Poll::Ready(Some(item)) means item was received out of the stream.

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);
Loading content...

Provided methods

pub fn next_back(&mut self) -> NextBackFuture<'_, Self> where
    Self: Unpin
[src]

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);

pub fn nth_back(&mut self, n: usize) -> NthBackFuture<'_, Self> where
    Self: Unpin
[src]

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));

pub fn rfind<P>(&mut self, p: P) -> RFindFuture<'_, Self, P> where
    Self: Unpin,
    P: FnMut(&Self::Item) -> bool
[src]

Returns the the frist 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));

pub fn rfold<B, F>(self, accum: B, f: F) -> RFoldFuture<Self, F, B> where
    F: FnMut(B, Self::Item) -> B, 
[src]

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);

pub fn try_rfold<B, F, E>(self, accum: B, f: F) -> TryRFoldFuture<Self, F, B> where
    F: FnMut(B, Self::Item) -> Result<B, E>, 
[src]

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"));
Loading content...

Implementations on Foreign Types

impl<T> DoubleEndedStream for FromIter<T> where
    T: DoubleEndedIterator
[src]

impl<T> DoubleEndedStream for Once<T>[src]

impl<T> DoubleEndedStream for Pending<T>[src]

Loading content...

Implementors

Loading content...