Skip to content

Commit 2d7fc4d

Browse files
committed
Reduce genericity in TakeWhile
1 parent 5902522 commit 2d7fc4d

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

+23-16
Original file line numberDiff line numberDiff line change
@@ -1495,14 +1495,13 @@ impl<I: Iterator, P> Iterator for TakeWhile<I, P>
14951495
if self.flag {
14961496
None
14971497
} else {
1498-
self.iter.next().and_then(|x| {
1499-
if (self.predicate)(&x) {
1500-
Some(x)
1501-
} else {
1502-
self.flag = true;
1503-
None
1504-
}
1505-
})
1498+
let x = self.iter.next()?;
1499+
if (self.predicate)(&x) {
1500+
Some(x)
1501+
} else {
1502+
self.flag = true;
1503+
None
1504+
}
15061505
}
15071506
}
15081507

@@ -1517,22 +1516,30 @@ impl<I: Iterator, P> Iterator for TakeWhile<I, P>
15171516
}
15181517

15191518
#[inline]
1520-
fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1519+
fn try_fold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
15211520
Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
15221521
{
1523-
if self.flag {
1524-
Try::from_ok(init)
1525-
} else {
1526-
let flag = &mut self.flag;
1527-
let p = &mut self.predicate;
1528-
self.iter.try_fold(init, move |acc, x|{
1522+
fn check<'a, T, Acc, R: Try<Ok = Acc>>(
1523+
flag: &'a mut bool,
1524+
p: &'a mut impl FnMut(&T) -> bool,
1525+
mut fold: impl FnMut(Acc, T) -> R + 'a,
1526+
) -> impl FnMut(Acc, T) -> LoopState<Acc, R> + 'a {
1527+
move |acc, x| {
15291528
if p(&x) {
15301529
LoopState::from_try(fold(acc, x))
15311530
} else {
15321531
*flag = true;
15331532
LoopState::Break(Try::from_ok(acc))
15341533
}
1535-
}).into_try()
1534+
}
1535+
}
1536+
1537+
if self.flag {
1538+
Try::from_ok(init)
1539+
} else {
1540+
let flag = &mut self.flag;
1541+
let p = &mut self.predicate;
1542+
self.iter.try_fold(init, check(flag, p, fold)).into_try()
15361543
}
15371544
}
15381545
}

0 commit comments

Comments
 (0)