Skip to content

Commit 0aa38e9

Browse files
committed
replace by_ref with internal iteration
1 parent c5c9967 commit 0aa38e9

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
@@ -57,13 +57,17 @@ impl<I, V, F> Iterator for UniqueBy<I, V, F>
5757
type Item = I::Item;
5858

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

6973
#[inline]
@@ -107,14 +111,16 @@ impl<I> Iterator for Unique<I>
107111
type Item = I::Item;
108112

109113
fn next(&mut self) -> Option<Self::Item> {
110-
for v in self.iter.iter.by_ref() {
111-
if let Entry::Vacant(entry) = self.iter.used.entry(v) {
114+
let used = &mut self.iter.used;
115+
self.iter.iter.find_map(|v| {
116+
if let Entry::Vacant(entry) = used.entry(v) {
112117
let elt = entry.key().clone();
113118
entry.insert(());
114-
return Some(elt);
119+
Some(elt)
120+
} else {
121+
None
115122
}
116-
}
117-
None
123+
})
118124
}
119125

120126
#[inline]

0 commit comments

Comments
 (0)