Skip to content

Commit ade2cf8

Browse files
committed
refactor default fold, try_fold, rfold and try_rfold implementation to common functions
1 parent f78d59a commit ade2cf8

File tree

2 files changed

+70
-48
lines changed

2 files changed

+70
-48
lines changed

library/core/src/iter/traits/double_ended.rs

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -214,17 +214,13 @@ pub trait DoubleEndedIterator: Iterator {
214214
/// ```
215215
#[inline]
216216
#[stable(feature = "iterator_try_fold", since = "1.27.0")]
217-
fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R
217+
fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
218218
where
219219
Self: Sized,
220220
F: FnMut(B, Self::Item) -> R,
221221
R: Try<Ok = B>,
222222
{
223-
let mut accum = init;
224-
while let Some(x) = self.next_back() {
225-
accum = f(accum, x)?;
226-
}
227-
try { accum }
223+
default_try_rfold(self, init, f)
228224
}
229225

230226
/// An iterator method that reduces the iterator's elements to a single,
@@ -278,16 +274,12 @@ pub trait DoubleEndedIterator: Iterator {
278274
/// ```
279275
#[inline]
280276
#[stable(feature = "iter_rfold", since = "1.27.0")]
281-
fn rfold<B, F>(mut self, init: B, mut f: F) -> B
277+
fn rfold<B, F>(self, init: B, f: F) -> B
282278
where
283279
Self: Sized,
284280
F: FnMut(B, Self::Item) -> B,
285281
{
286-
let mut accum = init;
287-
while let Some(x) = self.next_back() {
288-
accum = f(accum, x);
289-
}
290-
accum
282+
default_rfold(self, init, f)
291283
}
292284

293285
/// Searches for an element of an iterator from the back that satisfies a predicate.
@@ -349,6 +341,33 @@ pub trait DoubleEndedIterator: Iterator {
349341
}
350342
}
351343

344+
#[inline]
345+
fn default_try_rfold<I, B, F, R>(iter: &mut I, init: B, mut f: F) -> R
346+
where
347+
I: DoubleEndedIterator + ?Sized,
348+
F: FnMut(B, I::Item) -> R,
349+
R: Try<Ok = B>,
350+
{
351+
let mut accum = init;
352+
while let Some(x) = iter.next_back() {
353+
accum = f(accum, x)?;
354+
}
355+
try { accum }
356+
}
357+
358+
#[inline]
359+
fn default_rfold<I, B, F>(mut iter: I, init: B, mut f: F) -> B
360+
where
361+
I: DoubleEndedIterator,
362+
F: FnMut(B, I::Item) -> B,
363+
{
364+
let mut accum = init;
365+
while let Some(x) = iter.next_back() {
366+
accum = f(accum, x);
367+
}
368+
accum
369+
}
370+
352371
#[stable(feature = "rust1", since = "1.0.0")]
353372
impl<'a, I: DoubleEndedIterator + ?Sized> DoubleEndedIterator for &'a mut I {
354373
fn next_back(&mut self) -> Option<I::Item> {
@@ -389,27 +408,19 @@ trait SpecSizedDoubleEndedIterator: DoubleEndedIterator {
389408

390409
impl<I: DoubleEndedIterator + ?Sized> SpecSizedDoubleEndedIterator for &mut I {
391410
#[inline]
392-
default fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R
411+
default fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
393412
where
394413
F: FnMut(B, Self::Item) -> R,
395414
R: Try<Ok = B>,
396415
{
397-
let mut accum = init;
398-
while let Some(x) = self.next_back() {
399-
accum = f(accum, x)?;
400-
}
401-
try { accum }
416+
default_try_rfold(self, init, f)
402417
}
403418
#[inline]
404-
default fn rfold<B, F>(mut self, init: B, mut f: F) -> B
419+
default fn rfold<B, F>(self, init: B, f: F) -> B
405420
where
406421
F: FnMut(B, Self::Item) -> B,
407422
{
408-
let mut accum = init;
409-
while let Some(x) = (&mut self).next_back() {
410-
accum = f(accum, x);
411-
}
412-
accum
423+
default_rfold(self, init, f)
413424
}
414425
}
415426

library/core/src/iter/traits/iterator.rs

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1995,17 +1995,13 @@ pub trait Iterator {
19951995
/// ```
19961996
#[inline]
19971997
#[stable(feature = "iterator_try_fold", since = "1.27.0")]
1998-
fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R
1998+
fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
19991999
where
20002000
Self: Sized,
20012001
F: FnMut(B, Self::Item) -> R,
20022002
R: Try<Ok = B>,
20032003
{
2004-
let mut accum = init;
2005-
while let Some(x) = self.next() {
2006-
accum = f(accum, x)?;
2007-
}
2008-
try { accum }
2004+
default_try_fold(self, init, f)
20092005
}
20102006

20112007
/// An iterator method that applies a fallible function to each item in the
@@ -2136,16 +2132,12 @@ pub trait Iterator {
21362132
#[doc(alias = "inject")]
21372133
#[inline]
21382134
#[stable(feature = "rust1", since = "1.0.0")]
2139-
fn fold<B, F>(mut self, init: B, mut f: F) -> B
2135+
fn fold<B, F>(self, init: B, f: F) -> B
21402136
where
21412137
Self: Sized,
21422138
F: FnMut(B, Self::Item) -> B,
21432139
{
2144-
let mut accum = init;
2145-
while let Some(x) = self.next() {
2146-
accum = f(accum, x);
2147-
}
2148-
accum
2140+
default_fold(self, init, f)
21492141
}
21502142

21512143
/// Reduces the elements to a single one, by repeatedly applying a reducing
@@ -3415,6 +3407,33 @@ pub trait Iterator {
34153407
}
34163408
}
34173409

3410+
#[inline]
3411+
fn default_try_fold<I, B, F, R>(iter: &mut I, init: B, mut f: F) -> R
3412+
where
3413+
I: Iterator + ?Sized,
3414+
F: FnMut(B, I::Item) -> R,
3415+
R: Try<Ok = B>,
3416+
{
3417+
let mut accum = init;
3418+
while let Some(x) = iter.next() {
3419+
accum = f(accum, x)?;
3420+
}
3421+
try { accum }
3422+
}
3423+
3424+
#[inline]
3425+
fn default_fold<I, B, F>(mut iter: I, init: B, mut f: F) -> B
3426+
where
3427+
I: Iterator,
3428+
F: FnMut(B, I::Item) -> B,
3429+
{
3430+
let mut accum = init;
3431+
while let Some(x) = iter.next() {
3432+
accum = f(accum, x);
3433+
}
3434+
accum
3435+
}
3436+
34183437
#[stable(feature = "rust1", since = "1.0.0")]
34193438
impl<I: Iterator + ?Sized> Iterator for &mut I {
34203439
type Item = I::Item;
@@ -3459,27 +3478,19 @@ trait SpecSizedIterator: Iterator {
34593478

34603479
impl<I: Iterator + ?Sized> SpecSizedIterator for &mut I {
34613480
#[inline]
3462-
default fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R
3481+
default fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
34633482
where
34643483
F: FnMut(B, Self::Item) -> R,
34653484
R: Try<Ok = B>,
34663485
{
3467-
let mut accum = init;
3468-
while let Some(x) = self.next() {
3469-
accum = f(accum, x)?;
3470-
}
3471-
try { accum }
3486+
default_try_fold(self, init, f)
34723487
}
34733488
#[inline]
3474-
default fn fold<B, F>(mut self, init: B, mut f: F) -> B
3489+
default fn fold<B, F>(self, init: B, f: F) -> B
34753490
where
34763491
F: FnMut(B, Self::Item) -> B,
34773492
{
3478-
let mut accum = init;
3479-
while let Some(x) = (&mut self).next() {
3480-
accum = f(accum, x);
3481-
}
3482-
accum
3493+
default_fold(self, init, f)
34833494
}
34843495
}
34853496

0 commit comments

Comments
 (0)