]> git.lizzy.rs Git - rust.git/commitdiff
Reduce genericity in Skip
authorJosh Stone <jistone@redhat.com>
Fri, 12 Jul 2019 01:14:37 +0000 (18:14 -0700)
committerJosh Stone <jistone@redhat.com>
Mon, 12 Aug 2019 22:03:44 +0000 (15:03 -0700)
src/libcore/iter/adapters/mod.rs

index 1dd9149ceda04733d9ac3d91b33cdf8210a7e4a5..d8cdcaa1c853a17fd270117ebc1c8cce1c6e6704 100644 (file)
@@ -1624,7 +1624,10 @@ fn size_hint(&self) -> (usize, Option<usize>) {
         let (lower, upper) = self.iter.size_hint();
 
         let lower = lower.saturating_sub(self.n);
-        let upper = upper.map(|x| x.saturating_sub(self.n));
+        let upper = match upper {
+            Some(x) => Some(x.saturating_sub(self.n)),
+            None => None,
+        };
 
         (lower, upper)
     }
@@ -1685,19 +1688,26 @@ fn nth_back(&mut self, n: usize) -> Option<I::Item> {
         }
     }
 
-    fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
+    fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
     {
-        let mut n = self.len();
-        if n == 0 {
-            Try::from_ok(init)
-        } else {
-            self.iter.try_rfold(init, move |acc, x| {
+        fn check<T, Acc, R: Try<Ok = Acc>>(
+            mut n: usize,
+            mut fold: impl FnMut(Acc, T) -> R,
+        ) -> impl FnMut(Acc, T) -> LoopState<Acc, R> {
+            move |acc, x| {
                 n -= 1;
                 let r = fold(acc, x);
                 if n == 0 { LoopState::Break(r) }
                 else { LoopState::from_try(r) }
-            }).into_try()
+            }
+        }
+
+        let n = self.len();
+        if n == 0 {
+            Try::from_ok(init)
+        } else {
+            self.iter.try_rfold(init, check(n, fold)).into_try()
         }
     }
 }