Skip to content

Commit c4af380

Browse files
authored
Merge pull request rust-lang#45 from Stebalien/fix-stream-poll
Make stream::Fuse return None after finishing, not NotReady
2 parents 8ab5c59 + 82c09e3 commit c4af380

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

src/stream/fuse.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,10 @@ impl<S: Stream> Stream for Fuse<S> {
2121

2222
fn poll(&mut self, task: &mut Task) -> Poll<Option<S::Item>, S::Error> {
2323
let ret = self.stream.as_mut().map(|s| s.poll(task));
24-
match ret {
25-
Some(Poll::Ok(None)) => self.stream = None,
26-
_ => {}
24+
if let Some(Poll::Ok(None)) = ret {
25+
self.stream = None;
2726
}
28-
ret.unwrap_or(Poll::NotReady)
27+
ret.unwrap_or(Poll::Ok(None))
2928
}
3029

3130
fn schedule(&mut self, task: &mut Task) {

tests/stream.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
extern crate futures;
22

3-
use futures::{failed, finished, Future, promise};
3+
use futures::{failed, finished, Future, promise, Poll, Task};
44
use futures::stream::*;
55

66
mod support;
@@ -77,6 +77,18 @@ fn adapters() {
7777
assert_done(|| list().skip(2).collect(), Ok(vec![3]));
7878
}
7979

80+
#[test]
81+
fn fuse() {
82+
let mut stream = list().fuse();
83+
let mut task = Task::new();
84+
assert_eq!(stream.poll(&mut task), Poll::Ok(Some(1)));
85+
assert_eq!(stream.poll(&mut task), Poll::Ok(Some(2)));
86+
assert_eq!(stream.poll(&mut task), Poll::Ok(Some(3)));
87+
assert_eq!(stream.poll(&mut task), Poll::Ok(None));
88+
assert_eq!(stream.poll(&mut task), Poll::Ok(None));
89+
assert_eq!(stream.poll(&mut task), Poll::Ok(None));
90+
}
91+
8092
// #[test]
8193
// fn adapters_poll() {
8294
// assert_eq!(collect_poll(list().map(|a| a + 1)), Ok(vec![2, 3, 4]));

0 commit comments

Comments
 (0)