@@ -592,6 +592,19 @@ pub trait StreamingIteratorMut: StreamingIterator {
592
592
{
593
593
MapDerefMut { it : self , f }
594
594
}
595
+
596
+ /// Creates an iterator which flattens nested streaming iterators.
597
+ #[ inline]
598
+ fn flatten ( self ) -> Flatten < Self >
599
+ where
600
+ Self : Sized ,
601
+ Self :: Item : StreamingIterator ,
602
+ {
603
+ Flatten {
604
+ iter : self ,
605
+ first : true ,
606
+ }
607
+ }
595
608
}
596
609
597
610
impl < ' a , I : ?Sized > StreamingIteratorMut for & ' a mut I
@@ -1268,6 +1281,80 @@ where
1268
1281
}
1269
1282
}
1270
1283
1284
+ /// A streaming iterator that flattens nested streaming iterators.
1285
+ #[ derive( Debug ) ]
1286
+ pub struct Flatten < I > {
1287
+ iter : I ,
1288
+ first : bool ,
1289
+ }
1290
+
1291
+ impl < I > StreamingIterator for Flatten < I >
1292
+ where
1293
+ I : StreamingIteratorMut ,
1294
+ I :: Item : StreamingIterator ,
1295
+ {
1296
+ type Item = <I :: Item as StreamingIterator >:: Item ;
1297
+
1298
+ #[ inline]
1299
+ fn advance ( & mut self ) {
1300
+ if self . first {
1301
+ self . first = false ;
1302
+ self . iter . advance ( ) ;
1303
+ }
1304
+ while let Some ( iter) = self . iter . get_mut ( ) {
1305
+ iter. advance ( ) ;
1306
+ if !iter. is_done ( ) {
1307
+ break ;
1308
+ }
1309
+ self . iter . advance ( ) ; // since we got Some, self.iter is not done and can be advanced
1310
+ }
1311
+ }
1312
+
1313
+ #[ inline]
1314
+ fn is_done ( & self ) -> bool {
1315
+ match self . iter . get ( ) {
1316
+ Some ( iter) => iter. is_done ( ) ,
1317
+ None => true ,
1318
+ }
1319
+ }
1320
+
1321
+ #[ inline]
1322
+ fn get ( & self ) -> Option < & Self :: Item > {
1323
+ self . iter . get ( ) . and_then ( I :: Item :: get)
1324
+ }
1325
+
1326
+ #[ inline]
1327
+ fn fold < Acc , Fold > ( self , init : Acc , mut fold : Fold ) -> Acc
1328
+ where
1329
+ Self : Sized ,
1330
+ Fold : FnMut ( Acc , & Self :: Item ) -> Acc ,
1331
+ {
1332
+ self . iter
1333
+ . fold_mut ( init, |acc, item| item. fold ( acc, & mut fold) )
1334
+ }
1335
+ }
1336
+
1337
+ impl < I > StreamingIteratorMut for Flatten < I >
1338
+ where
1339
+ I : StreamingIteratorMut ,
1340
+ I :: Item : StreamingIteratorMut ,
1341
+ {
1342
+ #[ inline]
1343
+ fn get_mut ( & mut self ) -> Option < & mut Self :: Item > {
1344
+ self . iter . get_mut ( ) . and_then ( I :: Item :: get_mut)
1345
+ }
1346
+
1347
+ #[ inline]
1348
+ fn fold_mut < Acc , Fold > ( self , init : Acc , mut fold : Fold ) -> Acc
1349
+ where
1350
+ Self : Sized ,
1351
+ Fold : FnMut ( Acc , & mut Self :: Item ) -> Acc ,
1352
+ {
1353
+ self . iter
1354
+ . fold_mut ( init, |acc, item| item. fold_mut ( acc, & mut fold) )
1355
+ }
1356
+ }
1357
+
1271
1358
/// A regular, non-streaming iterator which both filters and maps elements of a streaming iterator with a closure.
1272
1359
#[ derive( Debug ) ]
1273
1360
pub struct FilterMapDeref < I , F > {
@@ -2549,6 +2636,34 @@ mod test {
2549
2636
test ( it, & [ 0 , 1 , 2 , 3 , 4 , 5 ] ) ;
2550
2637
}
2551
2638
2639
+ #[ test]
2640
+ fn flatten ( ) {
2641
+ let mut items = [
2642
+ convert_ref ( [ ] . as_ref ( ) ) ,
2643
+ convert_ref ( [ 1 ] . as_ref ( ) ) ,
2644
+ convert_ref ( [ ] . as_ref ( ) ) ,
2645
+ convert_ref ( [ 2 , 3 ] . as_ref ( ) ) ,
2646
+ convert_ref ( [ ] . as_ref ( ) ) ,
2647
+ ] ;
2648
+ let it = convert_mut ( & mut items) . flatten ( ) ;
2649
+
2650
+ test ( it, & [ 1 , 2 , 3 ] ) ;
2651
+ }
2652
+
2653
+ #[ test]
2654
+ fn flatten_unsized ( ) {
2655
+ type DynI32 = dyn StreamingIterator < Item = i32 > ;
2656
+ let mut items = [
2657
+ & mut once ( 1 ) as & mut DynI32 ,
2658
+ & mut empty ( ) ,
2659
+ & mut convert ( 2 ..=3 ) ,
2660
+ ] ;
2661
+ let iters = items. iter_mut ( ) . map ( |iter| & mut * * iter) ;
2662
+ let it = convert_mut ( iters) . flatten ( ) ;
2663
+
2664
+ test ( it, & [ 1 , 2 , 3 ] ) ;
2665
+ }
2666
+
2552
2667
#[ test]
2553
2668
fn nth ( ) {
2554
2669
let items = [ 0 , 1 ] ;
0 commit comments