Skip to content

Commit 06702ec

Browse files
committed
Add future::flatten_stream implementation
1 parent f333266 commit 06702ec

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Future
1818
- [x] future::and_then
1919
- [x] future::err_into
2020
- [x] future::flatten
21-
- [ ] future::flatten_stream
21+
- [x] future::flatten_stream
2222
- [x] future::inspect
2323
- [ ] future::into_stream
2424
- [x] future::map

src/future.rs

+37
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use futures::future::Future;
2+
use futures::stream::Stream;
23

34
pub async fn ready<T>(value: T) -> T {
45
value
@@ -101,6 +102,28 @@ pub async fn unwrap_or_else<Fut, T, E, F>(future: Fut, f: F) -> T
101102
future_result.unwrap_or_else(f)
102103
}
103104

105+
pub fn flatten_stream<Fut, St, T>(future: Fut) -> impl Stream<Item = T>
106+
where Fut: Future<Output = St>,
107+
St: Stream<Item = T>,
108+
{
109+
use crate::stream::next;
110+
futures::stream::unfold((Some(future), None), async move | (future, stream)| {
111+
match (future, stream) {
112+
(Some(future), None) => {
113+
let stream = await!(future);
114+
let mut stream = Box::pin(stream);
115+
let item = await!(next(&mut stream));
116+
item.map(|item| (item, (None, Some(stream))))
117+
},
118+
(None, Some(mut stream)) => {
119+
let item = await!(next(&mut stream));
120+
item.map(|item| (item, (None, Some(stream))))
121+
},
122+
_ => unreachable!()
123+
}
124+
})
125+
}
126+
104127
#[cfg(test)]
105128
mod tests {
106129
use futures::executor;
@@ -204,4 +227,18 @@ mod tests {
204227
assert_eq!(await!(new_future), ());
205228
});
206229
}
230+
231+
#[test]
232+
fn test_flatten_stream() {
233+
use futures::stream;
234+
use crate::stream::collect;
235+
executor::block_on(async {
236+
let stream_items = vec![17, 18, 19];
237+
let future_of_a_stream = ready(stream::iter(stream_items));
238+
239+
let stream = flatten_stream(future_of_a_stream);
240+
let list: Vec<_> = await!(collect(stream));
241+
assert_eq!(list, vec![17, 18, 19]);
242+
});
243+
}
207244
}

0 commit comments

Comments
 (0)