Skip to content

Commit

Permalink
auto merge of #12132 : brunoabinader/rust/list-matches-predicate, r=a…
Browse files Browse the repository at this point in the history
…lexcrichton

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).
  • Loading branch information
bors committed Feb 10, 2014
2 parents 4f16e51 + cb1fad3 commit 838c62b
Showing 1 changed file with 29 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/libcollections/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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]);
Expand Down

0 comments on commit 838c62b

Please sign in to comment.