@@ -393,6 +393,35 @@ impl<I, U> FlattenCompat<I, U>
393
393
where
394
394
I : DoubleEndedIterator < Item : IntoIterator < IntoIter = U > > ,
395
395
{
396
+ /// Folds the inner iterators into an accumulator by applying an operation, starting form the
397
+ /// back.
398
+ ///
399
+ /// Folds over the inner iterators, not over their elements. Is used by the `rfold` method.
400
+ #[ inline]
401
+ fn iter_rfold < Acc , Fold > ( self , mut acc : Acc , mut fold : Fold ) -> Acc
402
+ where
403
+ Fold : FnMut ( Acc , U ) -> Acc ,
404
+ {
405
+ #[ inline]
406
+ fn flatten < T : IntoIterator , Acc > (
407
+ fold : & mut impl FnMut ( Acc , T :: IntoIter ) -> Acc ,
408
+ ) -> impl FnMut ( Acc , T ) -> Acc + ' _ {
409
+ move |acc, iter| fold ( acc, iter. into_iter ( ) )
410
+ }
411
+
412
+ if let Some ( iter) = self . backiter {
413
+ acc = fold ( acc, iter) ;
414
+ }
415
+
416
+ acc = self . iter . rfold ( acc, flatten ( & mut fold) ) ;
417
+
418
+ if let Some ( iter) = self . frontiter {
419
+ acc = fold ( acc, iter) ;
420
+ }
421
+
422
+ acc
423
+ }
424
+
396
425
/// Folds over the inner iterators in reverse order as long as the given function returns
397
426
/// successfully, always storing the most recent inner iterator in `self.backiter`.
398
427
///
@@ -579,31 +608,18 @@ where
579
608
}
580
609
581
610
#[ inline]
582
- fn rfold < Acc , Fold > ( self , mut init : Acc , mut fold : Fold ) -> Acc
611
+ fn rfold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
583
612
where
584
613
Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
585
614
{
586
615
#[ inline]
587
- fn flatten < T : IntoIterator , Acc > (
588
- fold : & mut impl FnMut ( Acc , T :: Item ) -> Acc ,
589
- ) -> impl FnMut ( Acc , T ) -> Acc + ' _
590
- where
591
- T :: IntoIter : DoubleEndedIterator ,
592
- {
593
- move |acc, x| x. into_iter ( ) . rfold ( acc, & mut * fold)
594
- }
595
-
596
- if let Some ( back) = self . backiter {
597
- init = back. rfold ( init, & mut fold) ;
598
- }
599
-
600
- init = self . iter . rfold ( init, flatten ( & mut fold) ) ;
601
-
602
- if let Some ( front) = self . frontiter {
603
- init = front. rfold ( init, & mut fold) ;
616
+ fn flatten < U : DoubleEndedIterator , Acc > (
617
+ mut fold : impl FnMut ( Acc , U :: Item ) -> Acc ,
618
+ ) -> impl FnMut ( Acc , U ) -> Acc {
619
+ move |acc, iter| iter. rfold ( acc, & mut fold)
604
620
}
605
621
606
- init
622
+ self . iter_rfold ( init, flatten ( fold ) )
607
623
}
608
624
609
625
#[ inline]
0 commit comments