10
10
11
11
use convert:: TryFrom ;
12
12
use mem;
13
- use ops:: { self , Add , Sub } ;
13
+ use ops:: { self , Add , Sub , Try } ;
14
14
use usize;
15
15
16
16
use super :: { FusedIterator , TrustedLen } ;
@@ -397,6 +397,28 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
397
397
fn max ( mut self ) -> Option < A > {
398
398
self . next_back ( )
399
399
}
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
+ }
400
422
}
401
423
402
424
#[ unstable( feature = "inclusive_range" , reason = "recently added, follows RFC" , issue = "28237" ) ]
@@ -418,6 +440,28 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
418
440
_ => None ,
419
441
}
420
442
}
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
+ }
421
465
}
422
466
423
467
#[ unstable( feature = "fused" , issue = "35602" ) ]
0 commit comments