use core::pin::Pin; use core::future::Future; use crate::stream::IntoStream; /// Extends a collection with the contents of a stream. /// /// Streams produce a series of values asynchronously, and collections can also be thought of as a /// series of values. The `Extend` trait bridges this gap, allowing you to extend a collection /// asynchronously by including the contents of that stream. When extending a collection with an /// already existing key, that entry is updated or, in the case of collections that permit multiple /// entries with equal keys, that entry is inserted. /// /// ## Examples /// /// ``` /// # async_std::task::block_on(async { /// # /// use async_std::prelude::*; /// use async_std::stream; /// /// let mut v: Vec = vec![1, 2]; /// let s = stream::repeat(3usize).take(3); /// stream::Extend::extend(&mut v, s).await; /// /// assert_eq!(v, vec![1, 2, 3, 3, 3]); /// # /// # }) /// ``` #[cfg(feature = "unstable")] #[cfg_attr(feature = "docs", doc(cfg(unstable)))] pub trait Extend { /// Extends a collection with the contents of a stream. fn extend<'a, T: IntoStream + 'a>( &'a mut self, stream: T, ) -> Pin + 'a + Send>> where ::IntoStream: Send; } /// Extends a collection with the contents of a stream. /// /// Streams produce a series of values asynchronously, and collections can also be thought of as a /// series of values. The [`Extend`] trait bridges this gap, allowing you to extend a collection /// asynchronously by including the contents of that stream. When extending a collection with an /// already existing key, that entry is updated or, in the case of collections that permit multiple /// entries with equal keys, that entry is inserted. /// /// [`Extend`]: trait.Extend.html /// /// ## Examples /// /// ``` /// # async_std::task::block_on(async { /// # /// use async_std::prelude::*; /// use async_std::stream; /// /// let mut v: Vec = vec![1, 2]; /// let s = stream::repeat(3usize).take(3); /// stream::extend(&mut v, s).await; /// /// assert_eq!(v, vec![1, 2, 3, 3, 3]); /// # /// # }) /// ``` #[cfg(feature = "unstable")] #[cfg_attr(feature = "docs", doc(cfg(unstable)))] pub async fn extend<'a, C, T, S>(collection: &mut C, stream: S) where C: Extend, S: IntoStream + 'a, ::IntoStream: Send, { Extend::extend(collection, stream).await }