Skip to content

Commit 5cbed65

Browse files
committed
Implement FromIterator for FuturesUnordered
1 parent 2b3f0f0 commit 5cbed65

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/stream/futures_unordered.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::cell::UnsafeCell;
22
use std::fmt::{self, Debug};
3+
use std::iter::FromIterator;
34
use std::marker::PhantomData;
45
use std::mem;
56
use std::ptr;
@@ -427,6 +428,18 @@ impl<T> Drop for FuturesUnordered<T> {
427428
}
428429
}
429430

431+
impl<F: Future> FromIterator<F> for FuturesUnordered<F> {
432+
fn from_iter<T>(iter: T) -> Self
433+
where T: IntoIterator<Item = F>
434+
{
435+
let mut new = FuturesUnordered::new();
436+
for future in iter.into_iter() {
437+
new.push(future);
438+
}
439+
new
440+
}
441+
}
442+
430443
impl<T> Inner<T> {
431444
/// The enqueue function from the 1024cores intrusive MPSC queue algorithm.
432445
fn enqueue(&self, node: *const Node<T>) {

tests/futures_unordered.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,20 @@ fn works_2() {
4646
assert!(spawn.poll_stream_notify(&support::notify_noop(), 0).unwrap().is_ready());
4747
}
4848

49+
#[test]
50+
fn from_iterator() {
51+
use futures::future::ok;
52+
use futures::stream::FuturesUnordered;
53+
54+
let stream = vec![
55+
ok::<u32, ()>(1),
56+
ok::<u32, ()>(2),
57+
ok::<u32, ()>(3)
58+
].into_iter().collect::<FuturesUnordered<_>>();
59+
assert_eq!(stream.len(), 3);
60+
assert_eq!(stream.collect().wait(), Ok(vec![1,2,3]));
61+
}
62+
4963
#[test]
5064
fn finished_future_ok() {
5165
let (_a_tx, a_rx) = oneshot::channel::<Box<Any+Send>>();

0 commit comments

Comments
 (0)