1010
1111use convert:: TryFrom ;
1212use mem;
13- use ops:: { self , Add , Sub } ;
13+ use ops:: { self , Add , Sub , Try } ;
1414use usize;
1515
1616use super :: { FusedIterator , TrustedLen } ;
@@ -397,6 +397,28 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
397397 fn max ( mut self ) -> Option < A > {
398398 self . next_back ( )
399399 }
400+
401+ #[ inline]
402+ fn try_fold < B , F , R > ( & mut self , init : B , mut f : F ) -> R where
403+ Self : Sized , F : FnMut ( B , Self :: Item ) -> R , R : Try < Ok =B >
404+ {
405+ let mut accum = init;
406+ if self . start <= self . end {
407+ loop {
408+ let ( x, done) =
409+ if self . start < self . end {
410+ let n = self . start . add_one ( ) ;
411+ ( mem:: replace ( & mut self . start , n) , false )
412+ } else {
413+ self . end . replace_zero ( ) ;
414+ ( self . start . replace_one ( ) , true )
415+ } ;
416+ accum = f ( accum, x) ?;
417+ if done { break }
418+ }
419+ }
420+ Try :: from_ok ( accum)
421+ }
400422}
401423
402424#[ unstable( feature = "inclusive_range" , reason = "recently added, follows RFC" , issue = "28237" ) ]
@@ -418,6 +440,28 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
418440 _ => None ,
419441 }
420442 }
443+
444+ #[ inline]
445+ fn try_rfold < B , F , R > ( & mut self , init : B , mut f : F ) -> R where
446+ Self : Sized , F : FnMut ( B , Self :: Item ) -> R , R : Try < Ok =B >
447+ {
448+ let mut accum = init;
449+ if self . start <= self . end {
450+ loop {
451+ let ( x, done) =
452+ if self . start < self . end {
453+ let n = self . end . sub_one ( ) ;
454+ ( mem:: replace ( & mut self . end , n) , false )
455+ } else {
456+ self . start . replace_one ( ) ;
457+ ( self . end . replace_zero ( ) , true )
458+ } ;
459+ accum = f ( accum, x) ?;
460+ if done { break }
461+ }
462+ }
463+ Try :: from_ok ( accum)
464+ }
421465}
422466
423467#[ unstable( feature = "fused" , issue = "35602" ) ]
0 commit comments