@@ -1624,7 +1624,10 @@ impl<I> Iterator for Skip<I> where I: Iterator {
16241624 let ( lower, upper) = self . iter . size_hint ( ) ;
16251625
16261626 let lower = lower. saturating_sub ( self . n ) ;
1627- let upper = upper. map ( |x| x. saturating_sub ( self . n ) ) ;
1627+ let upper = match upper {
1628+ Some ( x) => Some ( x. saturating_sub ( self . n ) ) ,
1629+ None => None ,
1630+ } ;
16281631
16291632 ( lower, upper)
16301633 }
@@ -1685,19 +1688,26 @@ impl<I> DoubleEndedIterator for Skip<I> where I: DoubleEndedIterator + ExactSize
16851688 }
16861689 }
16871690
1688- fn try_rfold < Acc , Fold , R > ( & mut self , init : Acc , mut fold : Fold ) -> R where
1691+ fn try_rfold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
16891692 Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
16901693 {
1691- let mut n = self . len ( ) ;
1692- if n == 0 {
1693- Try :: from_ok ( init )
1694- } else {
1695- self . iter . try_rfold ( init , move |acc, x| {
1694+ fn check < T , Acc , R : Try < Ok = Acc > > (
1695+ mut n : usize ,
1696+ mut fold : impl FnMut ( Acc , T ) -> R ,
1697+ ) -> impl FnMut ( Acc , T ) -> LoopState < Acc , R > {
1698+ move |acc, x| {
16961699 n -= 1 ;
16971700 let r = fold ( acc, x) ;
16981701 if n == 0 { LoopState :: Break ( r) }
16991702 else { LoopState :: from_try ( r) }
1700- } ) . into_try ( )
1703+ }
1704+ }
1705+
1706+ let n = self . len ( ) ;
1707+ if n == 0 {
1708+ Try :: from_ok ( init)
1709+ } else {
1710+ self . iter . try_rfold ( init, check ( n, fold) ) . into_try ( )
17011711 }
17021712 }
17031713}
0 commit comments