From cb1fad3b28475eceff3de26380297a2c92fe5deb Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Sun, 9 Feb 2014 13:03:47 -0400 Subject: [PATCH] Implement List's any() function 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). --- src/libcollections/list.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) 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(ls: @List, f: |&T| -> bool) -> Option { }; } +/** + * 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(ls: @List, 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(ls: @List, elt: T) -> bool { let mut found = false; @@ -222,6 +242,15 @@ mod tests { assert_eq!(list::find(empty, match_), option::None::); } + #[test] + fn test_any() { + fn match_(i: &int) -> bool { return *i == 2; } + let l = from_vec([0, 1, 2]); + let empty = @list::Nil::; + 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]);