@@ -461,6 +461,12 @@ impl<'a, I, T: 'a> DoubleEndedIterator for Cloned<I>
461
461
fn next_back ( & mut self ) -> Option < T > {
462
462
self . it . next_back ( ) . cloned ( )
463
463
}
464
+
465
+ fn rfold < Acc , F > ( self , init : Acc , mut f : F ) -> Acc
466
+ where F : FnMut ( Acc , Self :: Item ) -> Acc ,
467
+ {
468
+ self . it . rfold ( init, move |acc, elt| f ( acc, elt. clone ( ) ) )
469
+ }
464
470
}
465
471
466
472
#[ stable( feature = "iter_cloned" , since = "1.1.0" ) ]
@@ -773,6 +779,26 @@ impl<A, B> DoubleEndedIterator for Chain<A, B> where
773
779
ChainState :: Back => self . b . next_back ( ) ,
774
780
}
775
781
}
782
+
783
+ fn rfold < Acc , F > ( self , init : Acc , mut f : F ) -> Acc
784
+ where F : FnMut ( Acc , Self :: Item ) -> Acc ,
785
+ {
786
+ let mut accum = init;
787
+ match self . state {
788
+ ChainState :: Both | ChainState :: Back => {
789
+ accum = self . b . rfold ( accum, & mut f) ;
790
+ }
791
+ _ => { }
792
+ }
793
+ match self . state {
794
+ ChainState :: Both | ChainState :: Front => {
795
+ accum = self . a . rfold ( accum, & mut f) ;
796
+ }
797
+ _ => { }
798
+ }
799
+ accum
800
+ }
801
+
776
802
}
777
803
778
804
// Note: *both* must be fused to handle double-ended iterators.
@@ -1106,6 +1132,13 @@ impl<B, I: DoubleEndedIterator, F> DoubleEndedIterator for Map<I, F> where
1106
1132
fn next_back ( & mut self ) -> Option < B > {
1107
1133
self . iter . next_back ( ) . map ( & mut self . f )
1108
1134
}
1135
+
1136
+ fn rfold < Acc , G > ( self , init : Acc , mut g : G ) -> Acc
1137
+ where G : FnMut ( Acc , Self :: Item ) -> Acc ,
1138
+ {
1139
+ let mut f = self . f ;
1140
+ self . iter . rfold ( init, move |acc, elt| g ( acc, f ( elt) ) )
1141
+ }
1109
1142
}
1110
1143
1111
1144
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
0 commit comments