Skip to content

Commit fa53044

Browse files
committed
Polish code of FlatZipMap.
* Use `?` for exiting. * When the inner iterator is exhausted, proceed to advancing the outer iterator without unnecessarily looping. * Add comments.
1 parent 35b6048 commit fa53044

1 file changed

Lines changed: 13 additions & 14 deletions

File tree

src/iteration.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -119,23 +119,22 @@ where
119119
type Item = O;
120120

121121
fn next(&mut self) -> Option<Self::Item> {
122+
// This must loop because each outer iterator item could produce an inner iterator with
123+
// any number of items, including zero.
122124
loop {
123-
match self.inner {
124-
Some((ref i_item, ref mut j_iter)) => {
125-
if let Some(j_item) = j_iter.next() {
126-
return Some((self.output_fn)(i_item.clone(), j_item));
127-
}
128-
// If no items, try the outer iter.
129-
self.inner = None;
125+
// Try to produce an item using the current inner iterator.
126+
if let Some((ref i_item, ref mut j_iter)) = self.inner {
127+
if let Some(j_item) = j_iter.next() {
128+
return Some((self.output_fn)(i_item.clone(), j_item));
130129
}
131-
None => match self.outer_iterator.next() {
132-
Some(i_item) => {
133-
let j_iter = (self.iter_fn)(&i_item);
134-
self.inner = Some((i_item, j_iter));
135-
}
136-
None => return None,
137-
},
130+
// If no items, drop this inner iter and try the outer iter.
131+
self.inner = None;
138132
}
133+
134+
// Advance the outer iterator to produce a new inner iterator.
135+
let i_item = self.outer_iterator.next()?;
136+
let j_iter = (self.iter_fn)(&i_item);
137+
self.inner = Some((i_item, j_iter));
139138
}
140139
}
141140
}

0 commit comments

Comments
 (0)