Skip to content

Commit b46d5d1

Browse files
committed
Reduce genericity in TakeWhile
1 parent d7c072b commit b46d5d1

File tree

1 file changed

+23
-16
lines changed
  • src/libcore/iter/adapters

1 file changed

+23
-16
lines changed

src/libcore/iter/adapters/mod.rs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,14 +1423,13 @@ impl<I: Iterator, P> Iterator for TakeWhile<I, P>
14231423
if self.flag {
14241424
None
14251425
} else {
1426-
self.iter.next().and_then(|x| {
1427-
if (self.predicate)(&x) {
1428-
Some(x)
1429-
} else {
1430-
self.flag = true;
1431-
None
1432-
}
1433-
})
1426+
let x = self.iter.next()?;
1427+
if (self.predicate)(&x) {
1428+
Some(x)
1429+
} else {
1430+
self.flag = true;
1431+
None
1432+
}
14341433
}
14351434
}
14361435

@@ -1445,22 +1444,30 @@ impl<I: Iterator, P> Iterator for TakeWhile<I, P>
14451444
}
14461445

14471446
#[inline]
1448-
fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1447+
fn try_fold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
14491448
Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
14501449
{
1451-
if self.flag {
1452-
Try::from_ok(init)
1453-
} else {
1454-
let flag = &mut self.flag;
1455-
let p = &mut self.predicate;
1456-
self.iter.try_fold(init, move |acc, x|{
1450+
fn check<'a, T, Acc, R: Try<Ok = Acc>>(
1451+
flag: &'a mut bool,
1452+
p: &'a mut impl FnMut(&T) -> bool,
1453+
mut fold: impl FnMut(Acc, T) -> R + 'a,
1454+
) -> impl FnMut(Acc, T) -> LoopState<Acc, R> + 'a {
1455+
move |acc, x| {
14571456
if p(&x) {
14581457
LoopState::from_try(fold(acc, x))
14591458
} else {
14601459
*flag = true;
14611460
LoopState::Break(Try::from_ok(acc))
14621461
}
1463-
}).into_try()
1462+
}
1463+
}
1464+
1465+
if self.flag {
1466+
Try::from_ok(init)
1467+
} else {
1468+
let flag = &mut self.flag;
1469+
let p = &mut self.predicate;
1470+
self.iter.try_fold(init, check(flag, p, fold)).into_try()
14641471
}
14651472
}
14661473
}

0 commit comments

Comments
 (0)