Skip to content

Commit 2187a2a

Browse files
committed
feat: Add Stream::flat_map
1 parent 2dee289 commit 2187a2a

File tree

1 file changed

+39
-2
lines changed

1 file changed

+39
-2
lines changed

src/stream/stream/mod.rs

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ mod filter;
3030
mod filter_map;
3131
mod find;
3232
mod find_map;
33+
mod flatten;
3334
mod fold;
3435
mod for_each;
3536
mod fuse;
@@ -77,6 +78,7 @@ use try_for_each::TryForEeachFuture;
7778

7879
pub use chain::Chain;
7980
pub use filter::Filter;
81+
pub use flatten::FlatMap;
8082
pub use fuse::Fuse;
8183
pub use inspect::Inspect;
8284
pub use map::Map;
@@ -93,6 +95,7 @@ use std::marker::PhantomData;
9395

9496
use cfg_if::cfg_if;
9597

98+
use crate::stream::IntoStream;
9699
use crate::utils::extension_trait;
97100

98101
cfg_if! {
@@ -106,7 +109,6 @@ cfg_if! {
106109
cfg_if! {
107110
if #[cfg(any(feature = "unstable", feature = "docs"))] {
108111
mod merge;
109-
mod flatten;
110112

111113
use std::pin::Pin;
112114

@@ -496,7 +498,6 @@ extension_trait! {
496498
#
497499
# }) }
498500
```
499-
500501
"#]
501502
fn last(
502503
self,
@@ -570,6 +571,42 @@ extension_trait! {
570571
Filter::new(self, predicate)
571572
}
572573

574+
#[doc= r#"
575+
Creates an stream that works like map, but flattens nested structure.
576+
577+
# Examples
578+
579+
Basic usage:
580+
581+
```
582+
# async_std::task::block_on(async {
583+
584+
use std::collections::VecDeque;
585+
use async_std::prelude::*;
586+
use async_std::stream::IntoStream;
587+
588+
let inner1: VecDeque<u8> = vec![1,2,3].into_iter().collect();
589+
let inner2: VecDeque<u8> = vec![4,5,6].into_iter().collect();
590+
591+
let s: VecDeque<_> = vec![inner1, inner2].into_iter().collect();
592+
593+
let flat= s.flat_map(|s| s.into_stream() );
594+
let v: Vec<u8> = flat.collect().await;
595+
596+
assert_eq!(v, vec![1,2,3,4,5,6]);
597+
598+
# });
599+
```
600+
"#]
601+
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
602+
where
603+
Self: Sized,
604+
U: IntoStream,
605+
F: FnMut(Self::Item) -> U,
606+
{
607+
FlatMap::new(self, f)
608+
}
609+
573610
#[doc = r#"
574611
Both filters and maps a stream.
575612

0 commit comments

Comments
 (0)