diff options
| author | bors <bors@rust-lang.org> | 2014-02-10 10:16:31 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-02-10 10:16:31 -0800 |
| commit | 838c62bb288d0fa6b395a9807ad8a519406e48c3 (patch) | |
| tree | 4b9a6c4628367f5083acb7ffeef3adac8ffd93cc | |
| parent | 4f16e519f13cbfd78cd6c06fc0639df401bc0077 (diff) | |
| parent | cb1fad3b28475eceff3de26380297a2c92fe5deb (diff) | |
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).
| -rw-r--r-- | src/libcollections/list.rs | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/libcollections/list.rs b/src/libcollections/list.rs index 06ec24bdc9d..0dc13aa2b49 100644 --- a/src/libcollections/list.rs +++ b/src/libcollections/list.rs @@ -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; @@ -223,6 +243,15 @@ mod tests { } #[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]); let empty = @list::Nil::<int>; |
