@@ -600,7 +600,11 @@ pub trait StreamingIteratorMut: StreamingIterator {
600
600
Self : Sized ,
601
601
Self :: Item : StreamingIterator + Sized ,
602
602
{
603
- Flatten { iter : self }
603
+ Flatten {
604
+ iter : self ,
605
+ first : true ,
606
+ inner_first : true ,
607
+ }
604
608
}
605
609
}
606
610
@@ -1273,6 +1277,8 @@ where
1273
1277
#[ derive( Debug ) ]
1274
1278
pub struct Flatten < I > {
1275
1279
iter : I ,
1280
+ first : bool ,
1281
+ inner_first : bool ,
1276
1282
}
1277
1283
1278
1284
impl < I , J > StreamingIterator for Flatten < I >
@@ -1284,17 +1290,20 @@ where
1284
1290
1285
1291
#[ inline]
1286
1292
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 ;
1289
1300
iter. advance ( ) ;
1290
1301
if !iter. is_done ( ) {
1291
1302
break ;
1292
1303
}
1293
1304
}
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 ;
1298
1307
}
1299
1308
}
1300
1309
@@ -2564,10 +2573,16 @@ mod test {
2564
2573
2565
2574
#[ test]
2566
2575
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
+ ] ;
2568
2583
let it = convert_mut ( & mut items) . flatten ( ) ;
2569
2584
2570
- test ( it, & [ 0 , 1 , 2 , 3 , 4 , 5 ] ) ;
2585
+ test ( it, & [ 1 , 2 , 3 ] ) ;
2571
2586
}
2572
2587
2573
2588
#[ test]
0 commit comments