@@ -605,7 +605,11 @@ pub trait StreamingIteratorMut: StreamingIterator {
605
605
Self : Sized ,
606
606
Self :: Item : StreamingIterator + Sized ,
607
607
{
608
- Flatten { iter : self }
608
+ Flatten {
609
+ iter : self ,
610
+ first : true ,
611
+ inner_first : true ,
612
+ }
609
613
}
610
614
}
611
615
@@ -1278,6 +1282,8 @@ where
1278
1282
#[ derive( Debug ) ]
1279
1283
pub struct Flatten < I > {
1280
1284
iter : I ,
1285
+ first : bool ,
1286
+ inner_first : bool ,
1281
1287
}
1282
1288
1283
1289
impl < I , J > StreamingIterator for Flatten < I >
@@ -1289,17 +1295,20 @@ where
1289
1295
1290
1296
#[ inline]
1291
1297
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 ;
1294
1305
iter. advance ( ) ;
1295
1306
if !iter. is_done ( ) {
1296
1307
break ;
1297
1308
}
1298
1309
}
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 ;
1303
1312
}
1304
1313
}
1305
1314
@@ -2569,10 +2578,16 @@ mod test {
2569
2578
2570
2579
#[ test]
2571
2580
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
+ ] ;
2573
2588
let it = convert_mut ( & mut items) . flatten ( ) ;
2574
2589
2575
- test ( it, & [ 0 , 1 , 2 , 3 , 4 , 5 ] ) ;
2590
+ test ( it, & [ 1 , 2 , 3 ] ) ;
2576
2591
}
2577
2592
2578
2593
#[ test]
0 commit comments