@@ -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 ) ]
12791283pub struct Flatten < I > {
12801284 iter : I ,
1285+ first : bool ,
1286+ inner_first : bool ,
12811287}
12821288
12831289impl < 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