Trait async_std::stream::FromStream[][src]

pub trait FromStream<T: Send> {
    fn from_stream<'a, S: IntoStream<Item = T> + 'a>(
        stream: S
    ) -> Pin<Box<dyn Future<Output = Self> + Send + 'a>>

Notable traits for Pin<P>

impl<P> Future for Pin<P> where
    P: Unpin + DerefMut,
    <P as Deref>::Target: Future
type Output = <<P as Deref>::Target as Future>::Output;

    where
        <S as IntoStream>::IntoStream: Send
; }

Conversion from a Stream.

By implementing FromStream for a type, you define how it will be created from a stream. This is common for types which describe a collection of some kind.

See also: IntoStream.

Examples

Basic usage:

use async_std::prelude::*;
use async_std::stream::{self, FromStream};

let five_fives = stream::repeat(5).take(5);

let v = Vec::from_stream(five_fives).await;

assert_eq!(v, vec![5, 5, 5, 5, 5]);

Using collect to implicitly use FromStream

use async_std::prelude::*;
use async_std::stream;
let five_fives = stream::repeat(5).take(5);

let v: Vec<i32> = five_fives.collect().await;

assert_eq!(v, vec![5, 5, 5, 5, 5]);

Implementing FromStream for your type:

use async_std::prelude::*;
use async_std::stream::{self, FromStream, IntoStream};
use std::pin::Pin;

// A sample collection, that's just a wrapper over Vec<T>
#[derive(Debug)]
struct MyCollection(Vec<i32>);

// Let's give it some methods so we can create one and add things
// to it.
impl MyCollection {
    fn new() -> MyCollection {
        MyCollection(Vec::new())
    }

    fn add(&mut self, elem: i32) {
        self.0.push(elem);
    }
}

// and we'll implement FromIterator
impl FromStream<i32> for MyCollection {
    fn from_stream<'a, S: IntoStream<Item = i32> + 'a>(
        stream: S,
    ) -> Pin<Box<dyn Future<Output = Self> + 'a + Send>>
   where
       <S as IntoStream>::IntoStream: Send,
   {
        let stream = stream.into_stream();

        Box::pin(async move {
            let mut c = MyCollection::new();

            let mut v = vec![];
            stream::extend(&mut v, stream).await;

            for i in v {
                c.add(i);
            }
            c
        })
    }
}

// Now we can make a new stream...
let stream = stream::repeat(5).take(5);

// ...and make a MyCollection out of it
let c = MyCollection::from_stream(stream).await;

assert_eq!(c.0, vec![5, 5, 5, 5, 5]);

// collect works too!

let stream = stream::repeat(5).take(5);
let c: MyCollection = stream.collect().await;

assert_eq!(c.0, vec![5, 5, 5, 5, 5]);

Required methods

fn from_stream<'a, S: IntoStream<Item = T> + 'a>(
    stream: S
) -> Pin<Box<dyn Future<Output = Self> + Send + 'a>>

Notable traits for Pin<P>

impl<P> Future for Pin<P> where
    P: Unpin + DerefMut,
    <P as Deref>::Target: Future
type Output = <<P as Deref>::Target as Future>::Output;
where
    <S as IntoStream>::IntoStream: Send
[src]

Creates a value from a stream.

Examples

Basic usage:

use async_std::prelude::*;
use async_std::stream::{self, FromStream};

let five_fives = stream::repeat(5).take(5);

let v = Vec::from_stream(five_fives).await;

assert_eq!(v, vec![5, 5, 5, 5, 5]);
Loading content...

Implementations on Foreign Types

impl FromStream<()> for ()[src]

impl<T: Send> FromStream<T> for Vec<T>[src]

impl<'b, T: Clone + Send> FromStream<T> for Cow<'b, [T]>[src]

impl<T: Send> FromStream<T> for Box<[T]>[src]

impl<T: Send> FromStream<T> for Rc<[T]>[src]

impl<T, E, V> FromStream<Result<T, E>> for Result<V, E> where
    T: Send,
    E: Send,
    V: FromStream<T>, 
[src]

fn from_stream<'a, S: IntoStream<Item = Result<T, E>> + 'a>(
    stream: S
) -> Pin<Box<dyn Future<Output = Self> + Send + 'a>>

Notable traits for Pin<P>

impl<P> Future for Pin<P> where
    P: Unpin + DerefMut,
    <P as Deref>::Target: Future
type Output = <<P as Deref>::Target as Future>::Output;
where
    <S as IntoStream>::IntoStream: Send
[src]

Takes each element in the stream: if it is an Err, no further elements are taken, and the Err is returned. Should no Err occur, a container with the values of each Result is returned.

Examples

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

let v = stream::from_iter(vec![1, 2]);
let res: Result<Vec<u32>, &'static str> = v.map(|x: u32|
    x.checked_add(1).ok_or("Overflow!")
).collect().await;
assert_eq!(res, Ok(vec![2, 3]));

impl<T: Send, V> FromStream<Option<T>> for Option<V> where
    V: FromStream<T>, 
[src]

fn from_stream<'a, S: IntoStream<Item = Option<T>> + 'a>(
    stream: S
) -> Pin<Box<dyn Future<Output = Self> + Send + 'a>>

Notable traits for Pin<P>

impl<P> Future for Pin<P> where
    P: Unpin + DerefMut,
    <P as Deref>::Target: Future
type Output = <<P as Deref>::Target as Future>::Output;
where
    <S as IntoStream>::IntoStream: Send
[src]

Takes each element in the stream: if it is None, no further elements are taken, and None is returned. Should no None occur, a container with the values of each Option is returned.

impl FromStream<char> for String[src]

impl<'b> FromStream<&'b char> for String[src]

impl<'b> FromStream<&'b str> for String[src]

impl FromStream<String> for String[src]

impl<'b> FromStream<Cow<'b, str>> for String[src]

impl<T: Ord + Send> FromStream<T> for BinaryHeap<T>[src]

impl<K: Ord + Send, V: Send> FromStream<(K, V)> for BTreeMap<K, V>[src]

impl<T: Ord + Send> FromStream<T> for BTreeSet<T>[src]

impl<K, V, H> FromStream<(K, V)> for HashMap<K, V, H> where
    K: Eq + Hash + Send,
    H: BuildHasher + Default + Send,
    V: Send
[src]

impl<T, H> FromStream<T> for HashSet<T, H> where
    T: Eq + Hash + Send,
    H: BuildHasher + Default + Send
[src]

impl<T: Send> FromStream<T> for LinkedList<T>[src]

impl<T: Send> FromStream<T> for VecDeque<T>[src]

Loading content...

Implementors

impl<'b, P: AsRef<Path> + 'b + Send> FromStream<P> for PathBuf[src]

impl<T: Send> FromStream<T> for Arc<[T]>[src]

Loading content...