from/into stream
Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> update examples Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> impl collect Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> compiles! Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> layout base for collect into vec Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> fmt Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> progress Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> compiles! Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> define failing test Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> cargo fmt Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> stuck again Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> fix trait bounds! Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> cargo fmt Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> hide dyn fut impl Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> dyn ret for vec Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> cargo fmt Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> collect docs Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> remove macro from vec::from_stream Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> shorten collect trait bound Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> Remove some Unpin and Send bounds Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com>pull/125/head
parent
60a62f90fd
commit
6c4c958abc
@ -0,0 +1,28 @@
|
||||
use super::IntoStream;
|
||||
|
||||
use std::pin::Pin;
|
||||
|
||||
/// 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`].
|
||||
///
|
||||
/// [`IntoStream`]: trait.IntoStream.html
|
||||
pub trait FromStream<T> {
|
||||
/// Creates a value from a stream.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// // use async_std::stream::FromStream;
|
||||
///
|
||||
/// // let _five_fives = async_std::stream::repeat(5).take(5);
|
||||
/// ```
|
||||
fn from_stream<'a, S: IntoStream<Item = T> + 'a>(
|
||||
stream: S,
|
||||
) -> Pin<Box<dyn core::future::Future<Output = Self> + 'a>>;
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
use futures_core::stream::Stream;
|
||||
|
||||
/// Conversion into a `Stream`.
|
||||
///
|
||||
/// By implementing `IntoIterator` for a type, you define how it will be
|
||||
/// converted to an iterator. This is common for types which describe a
|
||||
/// collection of some kind.
|
||||
///
|
||||
/// [`from_stream`]: #tymethod.from_stream
|
||||
/// [`Stream`]: trait.Stream.html
|
||||
/// [`collect`]: trait.Stream.html#method.collect
|
||||
///
|
||||
/// See also: [`FromStream`].
|
||||
///
|
||||
/// [`FromStream`]: trait.FromStream.html
|
||||
pub trait IntoStream {
|
||||
/// The type of the elements being iterated over.
|
||||
type Item;
|
||||
|
||||
/// Which kind of stream are we turning this into?
|
||||
type IntoStream: Stream<Item = Self::Item>;
|
||||
|
||||
/// Creates a stream from a value.
|
||||
fn into_stream(self) -> Self::IntoStream;
|
||||
}
|
||||
|
||||
impl<I: Stream> IntoStream for I {
|
||||
type Item = I::Item;
|
||||
type IntoStream = I;
|
||||
|
||||
#[inline]
|
||||
fn into_stream(self) -> I {
|
||||
self
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
use crate::stream::{FromStream, IntoStream, Stream};
|
||||
|
||||
use std::pin::Pin;
|
||||
|
||||
impl<T> FromStream<T> for Vec<T> {
|
||||
#[inline]
|
||||
fn from_stream<'a, S: IntoStream<Item = T>>(
|
||||
stream: S,
|
||||
) -> Pin<Box<dyn core::future::Future<Output = Self> + 'a>>
|
||||
where
|
||||
<S as IntoStream>::IntoStream: 'a,
|
||||
{
|
||||
let stream = stream.into_stream();
|
||||
|
||||
Pin::from(Box::new(async move {
|
||||
pin_utils::pin_mut!(stream);
|
||||
|
||||
let mut out = vec![];
|
||||
while let Some(item) = stream.next().await {
|
||||
out.push(item);
|
||||
}
|
||||
out
|
||||
}))
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
//! The Rust core allocation and collections library
|
||||
//!
|
||||
//! This library provides smart pointers and collections for managing
|
||||
//! heap-allocated values.
|
||||
|
||||
mod from_stream;
|
||||
|
||||
#[doc(inline)]
|
||||
pub use std::vec::Vec;
|
Loading…
Reference in New Issue