auto merge of #12132 : brunoabinader/rust/list-matches-predicate, r=alexcrichton

This is needed for cases where we only need to know if a list item matches the given predicate (eg. in Servo, we need to know if attributes from different DOM elements are equal).
This commit is contained in:
bors 2014-02-10 10:16:31 -08:00
commit 838c62bb28
1 changed files with 29 additions and 0 deletions

View File

@ -63,6 +63,26 @@ pub fn find<T:Clone>(ls: @List<T>, f: |&T| -> bool) -> Option<T> {
};
}
/**
* Returns true if a list contains an element that matches a given predicate
*
* Apply function `f` to each element of `ls`, starting from the first.
* When function `f` returns true then it also returns true. If `f` matches no
* elements then false is returned.
*/
pub fn any<T>(ls: @List<T>, f: |&T| -> bool) -> bool {
let mut ls = ls;
loop {
ls = match *ls {
Cons(ref hd, tl) => {
if f(hd) { return true; }
tl
}
Nil => return false
}
};
}
/// Returns true if a list contains an element with the given value
pub fn has<T:Eq>(ls: @List<T>, elt: T) -> bool {
let mut found = false;
@ -222,6 +242,15 @@ mod tests {
assert_eq!(list::find(empty, match_), option::None::<int>);
}
#[test]
fn test_any() {
fn match_(i: &int) -> bool { return *i == 2; }
let l = from_vec([0, 1, 2]);
let empty = @list::Nil::<int>;
assert_eq!(list::any(l, match_), true);
assert_eq!(list::any(empty, match_), false);
}
#[test]
fn test_has() {
let l = from_vec([5, 8, 6]);