@@ -13,7 +13,7 @@ use stream::Stream;
13
13
/// for the returned `Future` to complete with `(a, b)`. It will then yield the
14
14
/// value `a`, and use `b` as the next internal state.
15
15
///
16
- /// If the future returns `None` instead of `Some`, then the `unfold()`
16
+ /// If the closure returns `None` instead of `Some(Future) `, then the `unfold()`
17
17
/// will stop producing items and return `Ok(Async::Ready(None))` in future
18
18
/// calls to `poll()`.
19
19
///
@@ -33,23 +33,22 @@ use stream::Stream;
33
33
/// use futures::future::{self, Future};
34
34
///
35
35
/// let mut stream = stream::unfold(0, |state| {
36
- /// future::ok::<_, u32>(
37
- /// if state <= 2 {
38
- /// let next_state = state + 1;
39
- /// let yielded = state * 2;
40
- /// Some((yielded, next_state))
41
- /// } else {
42
- /// None
43
- /// }
44
- /// )
36
+ /// if state <= 2 {
37
+ /// let next_state = state + 1;
38
+ /// let yielded = state * 2;
39
+ /// let fut = future::ok::<_, u32>((yielded, next_state));
40
+ /// Some(fut)
41
+ /// } else {
42
+ /// None
43
+ /// }
45
44
/// });
46
45
///
47
46
/// let result = stream.collect().wait();
48
47
/// assert_eq!(result, Ok(vec![0, 2, 4]));
49
48
/// ```
50
49
pub fn unfold < T , F , Fut , It > ( init : T , f : F ) -> Unfold < T , F , Fut >
51
- where F : FnMut ( T ) -> Fut ,
52
- Fut : IntoFuture < Item = Option < ( It , T ) > > ,
50
+ where F : FnMut ( T ) -> Option < Fut > ,
51
+ Fut : IntoFuture < Item = ( It , T ) > ,
53
52
{
54
53
Unfold {
55
54
f : f,
@@ -68,8 +67,8 @@ pub struct Unfold<T, F, Fut> where Fut: IntoFuture {
68
67
}
69
68
70
69
impl < T , F , Fut , It > Stream for Unfold < T , F , Fut >
71
- where F : FnMut ( T ) -> Fut ,
72
- Fut : IntoFuture < Item = Option < ( It , T ) > > ,
70
+ where F : FnMut ( T ) -> Option < Fut > ,
71
+ Fut : IntoFuture < Item = ( It , T ) > ,
73
72
{
74
73
type Item = It ;
75
74
type Error = Fut :: Error ;
@@ -80,18 +79,17 @@ impl <T, F, Fut, It> Stream for Unfold<T, F, Fut>
80
79
// State::Empty may happen if the future returned an error
81
80
State :: Empty => { return Ok ( Async :: Ready ( None ) ) ; }
82
81
State :: Ready ( state) => {
83
- let fut = ( self . f ) ( state) ;
84
- self . state = State :: Processing ( fut. into_future ( ) ) ;
82
+ match ( self . f ) ( state) {
83
+ Some ( fut) => { self . state = State :: Processing ( fut. into_future ( ) ) ; }
84
+ None => { return Ok ( Async :: Ready ( None ) ) ; }
85
+ }
85
86
}
86
87
State :: Processing ( mut fut) => {
87
88
match fut. poll ( ) ? {
88
- Async :: Ready ( Some ( ( item, next_state) ) ) => {
89
+ Async :: Ready ( ( item, next_state) ) => {
89
90
self . state = State :: Ready ( next_state) ;
90
91
return Ok ( Async :: Ready ( Some ( item) ) ) ;
91
92
}
92
- Async :: Ready ( None ) => {
93
- return Ok ( Async :: Ready ( None ) ) ;
94
- }
95
93
Async :: NotReady => {
96
94
self . state = State :: Processing ( fut) ;
97
95
return Ok ( Async :: NotReady ) ;
0 commit comments