Skip to content

Commit e5d6e41

Browse files
fix advance
1 parent 23f251e commit e5d6e41

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

src/lib.rs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,11 @@ pub trait StreamingIteratorMut: StreamingIterator {
605605
Self: Sized,
606606
Self::Item: StreamingIterator + Sized,
607607
{
608-
Flatten { iter: self }
608+
Flatten {
609+
iter: self,
610+
first: true,
611+
inner_first: true,
612+
}
609613
}
610614
}
611615

@@ -1278,6 +1282,8 @@ where
12781282
#[derive(Debug)]
12791283
pub struct Flatten<I> {
12801284
iter: I,
1285+
first: bool,
1286+
inner_first: bool,
12811287
}
12821288

12831289
impl<I, J> StreamingIterator for Flatten<I>
@@ -1289,17 +1295,20 @@ where
12891295

12901296
#[inline]
12911297
fn advance(&mut self) {
1292-
loop {
1293-
if let Some(ref mut iter) = self.iter.get_mut() {
1298+
if self.first {
1299+
self.first = false;
1300+
self.iter.advance();
1301+
}
1302+
while let Some(iter) = self.iter.get_mut() {
1303+
if self.inner_first || !iter.is_done() {
1304+
self.inner_first = false;
12941305
iter.advance();
12951306
if !iter.is_done() {
12961307
break;
12971308
}
12981309
}
1299-
self.iter.advance();
1300-
if self.iter.is_done() {
1301-
break;
1302-
}
1310+
self.iter.advance(); // since we got Some, self.iter is not done and can be advanced
1311+
self.inner_first = true;
13031312
}
13041313
}
13051314

@@ -2569,10 +2578,16 @@ mod test {
25692578

25702579
#[test]
25712580
fn flatten() {
2572-
let mut items = [convert([0, 1, 2]), convert([3, 4, 5])];
2581+
let mut items = [
2582+
convert_ref([].as_ref()),
2583+
convert_ref([1].as_ref()),
2584+
convert_ref([].as_ref()),
2585+
convert_ref([2, 3].as_ref()),
2586+
convert_ref([].as_ref()),
2587+
];
25732588
let it = convert_mut(&mut items).flatten();
25742589

2575-
test(it, &[0, 1, 2, 3, 4, 5]);
2590+
test(it, &[1, 2, 3]);
25762591
}
25772592

25782593
#[test]

0 commit comments

Comments
 (0)