diff options
| author | Josh Stone <jistone@redhat.com> | 2019-07-11 18:18:47 -0700 |
|---|---|---|
| committer | Josh Stone <jistone@redhat.com> | 2019-08-12 15:03:44 -0700 |
| commit | 0f82c0c210f970094499e277a23fa9af613515f0 (patch) | |
| tree | 461ae349f31087dda306bbd2352a442583da8c80 /src | |
| parent | 46a62ca9a4618b9c9c858a246b175639e801a757 (diff) | |
| download | rust-0f82c0c210f970094499e277a23fa9af613515f0.tar.gz rust-0f82c0c210f970094499e277a23fa9af613515f0.zip | |
Reduce genericity in Take
Diffstat (limited to 'src')
| -rw-r--r-- | src/libcore/iter/adapters/mod.rs | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/libcore/iter/adapters/mod.rs b/src/libcore/iter/adapters/mod.rs index d8cdcaa1c85..9789796318d 100644 --- a/src/libcore/iter/adapters/mod.rs +++ b/src/libcore/iter/adapters/mod.rs @@ -1782,19 +1782,26 @@ impl<I> Iterator for Take<I> where I: Iterator{ } #[inline] - fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where + fn try_fold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc> { - if self.n == 0 { - Try::from_ok(init) - } else { - let n = &mut self.n; - self.iter.try_fold(init, move |acc, x| { + fn check<'a, T, Acc, R: Try<Ok = Acc>>( + n: &'a mut usize, + mut fold: impl FnMut(Acc, T) -> R + 'a, + ) -> impl FnMut(Acc, T) -> LoopState<Acc, R> + 'a { + move |acc, x| { *n -= 1; let r = fold(acc, x); if *n == 0 { LoopState::Break(r) } else { LoopState::from_try(r) } - }).into_try() + } + } + + if self.n == 0 { + Try::from_ok(init) + } else { + let n = &mut self.n; + self.iter.try_fold(init, check(n, fold)).into_try() } } } |
