Skip to content

Commit f5c7c09

Browse files
committed
replace by_ref with internal iteration
1 parent 873dcf4 commit f5c7c09

File tree

3 files changed

+29
-24
lines changed

3 files changed

+29
-24
lines changed

src/adaptors/mod.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,14 +1027,18 @@ impl<I, F> Iterator for Positions<I, F>
10271027
type Item = usize;
10281028

10291029
fn next(&mut self) -> Option<Self::Item> {
1030-
for v in self.iter.by_ref() {
1031-
let i = self.count;
1032-
self.count = i + 1;
1033-
if (self.f)(v) {
1034-
return Some(i);
1030+
// let's help the borrow checker a little bit :)
1031+
let count = &mut self.count;
1032+
let f = &mut self.f;
1033+
self.iter.find_map(|v| {
1034+
let i = *count;
1035+
*count = i + 1;
1036+
if f(v) {
1037+
Some(i)
1038+
} else {
1039+
None
10351040
}
1036-
}
1037-
None
1041+
})
10381042
}
10391043

10401044
fn size_hint(&self) -> (usize, Option<usize>) {

src/lib.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1748,12 +1748,7 @@ pub trait Itertools : Iterator {
17481748
fn find_position<P>(&mut self, mut pred: P) -> Option<(usize, Self::Item)>
17491749
where P: FnMut(&Self::Item) -> bool
17501750
{
1751-
for (index, elt) in self.enumerate() {
1752-
if pred(&elt) {
1753-
return Some((index, elt));
1754-
}
1755-
}
1756-
None
1751+
self.enumerate().find(|x| pred(&x.1))
17571752
}
17581753
/// Find the value of the first element satisfying a predicate or return the last element, if any.
17591754
///

src/unique_impl.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,17 @@ impl<I, V, F> Iterator for UniqueBy<I, V, F>
5656
type Item = I::Item;
5757

5858
fn next(&mut self) -> Option<Self::Item> {
59-
for v in self.iter.by_ref() {
60-
let key = (self.f)(&v);
61-
if self.used.insert(key, ()).is_none() {
62-
return Some(v);
59+
// let's help the borrow checker a little bit :)
60+
let used = &mut self.used;
61+
let f = &mut self.f;
62+
self.iter.find_map(|v| {
63+
let key = f(&v);
64+
if used.insert(key, ()).is_none() {
65+
Some(v)
66+
} else {
67+
None
6368
}
64-
}
65-
None
69+
})
6670
}
6771

6872
#[inline]
@@ -106,14 +110,16 @@ impl<I> Iterator for Unique<I>
106110
type Item = I::Item;
107111

108112
fn next(&mut self) -> Option<Self::Item> {
109-
for v in self.iter.iter.by_ref() {
110-
if let Entry::Vacant(entry) = self.iter.used.entry(v) {
113+
let used = &mut self.iter.used;
114+
self.iter.iter.find_map(|v| {
115+
if let Entry::Vacant(entry) = used.entry(v) {
111116
let elt = entry.key().clone();
112117
entry.insert(());
113-
return Some(elt);
118+
Some(elt)
119+
} else {
120+
None
114121
}
115-
}
116-
None
122+
})
117123
}
118124

119125
#[inline]

0 commit comments

Comments
 (0)