Skip to content

Commit 03220e0

Browse files
LorenzSchuelercuviper
authored andcommitted
fix advance
1 parent 58cf57c commit 03220e0

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
@@ -600,7 +600,11 @@ pub trait StreamingIteratorMut: StreamingIterator {
600600
Self: Sized,
601601
Self::Item: StreamingIterator + Sized,
602602
{
603-
Flatten { iter: self }
603+
Flatten {
604+
iter: self,
605+
first: true,
606+
inner_first: true,
607+
}
604608
}
605609
}
606610

@@ -1273,6 +1277,8 @@ where
12731277
#[derive(Debug)]
12741278
pub struct Flatten<I> {
12751279
iter: I,
1280+
first: bool,
1281+
inner_first: bool,
12761282
}
12771283

12781284
impl<I, J> StreamingIterator for Flatten<I>
@@ -1284,17 +1290,20 @@ where
12841290

12851291
#[inline]
12861292
fn advance(&mut self) {
1287-
loop {
1288-
if let Some(ref mut iter) = self.iter.get_mut() {
1293+
if self.first {
1294+
self.first = false;
1295+
self.iter.advance();
1296+
}
1297+
while let Some(iter) = self.iter.get_mut() {
1298+
if self.inner_first || !iter.is_done() {
1299+
self.inner_first = false;
12891300
iter.advance();
12901301
if !iter.is_done() {
12911302
break;
12921303
}
12931304
}
1294-
self.iter.advance();
1295-
if self.iter.is_done() {
1296-
break;
1297-
}
1305+
self.iter.advance(); // since we got Some, self.iter is not done and can be advanced
1306+
self.inner_first = true;
12981307
}
12991308
}
13001309

@@ -2564,10 +2573,16 @@ mod test {
25642573

25652574
#[test]
25662575
fn flatten() {
2567-
let mut items = [convert([0, 1, 2]), convert([3, 4, 5])];
2576+
let mut items = [
2577+
convert_ref([].as_ref()),
2578+
convert_ref([1].as_ref()),
2579+
convert_ref([].as_ref()),
2580+
convert_ref([2, 3].as_ref()),
2581+
convert_ref([].as_ref()),
2582+
];
25682583
let it = convert_mut(&mut items).flatten();
25692584

2570-
test(it, &[0, 1, 2, 3, 4, 5]);
2585+
test(it, &[1, 2, 3]);
25712586
}
25722587

25732588
#[test]

0 commit comments

Comments
 (0)