iterator: add a find
adaptor
This commit is contained in:
parent
eac0200f18
commit
eb5ac84c8e
@ -308,6 +308,9 @@ pub trait IteratorUtil<A> {
|
|||||||
/// assert!(!it.any_(|&x| *x == 3));
|
/// assert!(!it.any_(|&x| *x == 3));
|
||||||
/// ~~~
|
/// ~~~
|
||||||
fn any_(&mut self, f: &fn(A) -> bool) -> bool;
|
fn any_(&mut self, f: &fn(A) -> bool) -> bool;
|
||||||
|
|
||||||
|
/// Return the first element satisfying the specified predicate
|
||||||
|
fn find(&mut self, predicate: &fn(&A) -> bool) -> Option<A>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Iterator adaptors provided for every `Iterator` implementation. The adaptor objects are also
|
/// Iterator adaptors provided for every `Iterator` implementation. The adaptor objects are also
|
||||||
@ -421,7 +424,7 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
|
|||||||
None => { break; }
|
None => { break; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return accum;
|
accum
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Count the number of items yielded by an iterator
|
/// Count the number of items yielded by an iterator
|
||||||
@ -431,13 +434,22 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
|
|||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn all(&mut self, f: &fn(A) -> bool) -> bool {
|
fn all(&mut self, f: &fn(A) -> bool) -> bool {
|
||||||
for self.advance |x| { if !f(x) { return false; } }
|
for self.advance |x| { if !f(x) { return false; } }
|
||||||
return true;
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn any_(&mut self, f: &fn(A) -> bool) -> bool {
|
fn any_(&mut self, f: &fn(A) -> bool) -> bool {
|
||||||
for self.advance |x| { if f(x) { return true; } }
|
for self.advance |x| { if f(x) { return true; } }
|
||||||
return false;
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the first element satisfying the specified predicate
|
||||||
|
#[inline(always)]
|
||||||
|
fn find(&mut self, predicate: &fn(&A) -> bool) -> Option<A> {
|
||||||
|
for self.advance |x| {
|
||||||
|
if predicate(&x) { return Some(x) }
|
||||||
|
}
|
||||||
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1055,4 +1067,12 @@ mod tests {
|
|||||||
assert!(!v.iter().any_(|&x| x > 100));
|
assert!(!v.iter().any_(|&x| x > 100));
|
||||||
assert!(!v.slice(0, 0).iter().any_(|_| fail!()));
|
assert!(!v.slice(0, 0).iter().any_(|_| fail!()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_find() {
|
||||||
|
let v = &[1, 3, 9, 27, 103, 14, 11];
|
||||||
|
assert_eq!(*v.iter().find(|x| *x & 1 == 0).unwrap(), 14);
|
||||||
|
assert_eq!(*v.iter().find(|x| *x % 3 == 0).unwrap(), 3);
|
||||||
|
assert!(v.iter().find(|x| *x % 12 == 0).is_none());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user