@@ -1624,7 +1624,10 @@ impl<I> Iterator for Skip<I> where I: Iterator {
1624
1624
let ( lower, upper) = self . iter . size_hint ( ) ;
1625
1625
1626
1626
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
+ } ;
1628
1631
1629
1632
( lower, upper)
1630
1633
}
@@ -1685,19 +1688,26 @@ impl<I> DoubleEndedIterator for Skip<I> where I: DoubleEndedIterator + ExactSize
1685
1688
}
1686
1689
}
1687
1690
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
1689
1692
Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
1690
1693
{
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| {
1696
1699
n -= 1 ;
1697
1700
let r = fold ( acc, x) ;
1698
1701
if n == 0 { LoopState :: Break ( r) }
1699
1702
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 ( )
1701
1711
}
1702
1712
}
1703
1713
}
0 commit comments