Skip to content

Commit 36157b3

Browse files
dungexblasrodri
authored andcommitted
stream: add stream utility function
Allows extending a Vec<T> with a Stream<Item=T>. Ref: #2842
1 parent 6d99e1c commit 36157b3

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

tokio/src/stream/extend.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use crate::stream::{Stream, StreamExt};
2+
use std::marker::Unpin;
3+
/// Extends a slice from a Stream
4+
/// # Example
5+
/// `rust,no_run`
6+
/// use tokio::stream;
7+
///
8+
/// let mut b = vec![0, 0, 0, 0];
9+
/// let stream = stream::iter(vec![0, 2, 4, 6]);
10+
///
11+
/// stream::extend(&mut buff, s).await;
12+
/// assert_eq!(vec![0, 2, 4, 6], buff);
13+
pub async fn extend<T, S>(buff: &mut Vec<T>, mut b: S)
14+
where
15+
S: Stream<Item = T> + Unpin,
16+
{
17+
while let Some(item) = b.next().await {
18+
buff.push(item)
19+
}
20+
}

tokio/src/stream/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ mod collect;
6666
use collect::Collect;
6767
pub use collect::FromStream;
6868

69+
mod extend;
70+
pub use extend::extend;
6971
mod empty;
7072
pub use empty::{empty, Empty};
7173

tokio/tests/stream_extend.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use tokio::stream;
2+
3+
#[tokio::test]
4+
async fn extend_stream() {
5+
let s = stream::iter(vec![0, 2, 4, 6]);
6+
let mut buff = vec![-2];
7+
stream::extend(&mut buff, s).await;
8+
assert_eq!(buff, vec![-2, 0, 2, 4, 6]);
9+
}

0 commit comments

Comments
 (0)