]> git.lizzy.rs Git - rust.git/commitdiff
Add vec::filter
authorJesse Ruderman <jruderman@gmail.com>
Sat, 24 Sep 2011 02:10:48 +0000 (19:10 -0700)
committerJesse Ruderman <jruderman@gmail.com>
Sat, 24 Sep 2011 02:10:48 +0000 (19:10 -0700)
src/lib/vec.rs
src/test/stdtest/vec.rs

index 6ca0c9bb61e0aaa3dfa63799678bba190996532b..fef91259b500d9f28acd887a7ff2590348215b3f 100644 (file)
@@ -213,6 +213,17 @@ fn filter_map<@T, @U>(f: block(T) -> option::t<U>, v: [mutable? T]) -> [U] {
     ret result;
 }
 
+fn filter<@T>(f: block(T) -> bool, v: [mutable? T]) -> [T] {
+    let result = [];
+    for elem: T in v {
+        let elem2 = elem; // satisfies alias checker
+        if f(elem2) {
+            result += [elem2];
+        }
+    }
+    ret result;
+}
+
 fn foldl<@T, @U>(p: block(U, T) -> U, z: U, v: [mutable? T]) -> U {
     let sz = len(v);
     if sz == 0u { ret z; }
index a9cda6c73d6e932f2ebf0c52288a477e0b612ef1..b7571d5bf0e82853791e27397b95449f22ddddd5 100644 (file)
@@ -12,6 +12,8 @@
 
 pure fn is_three(n: uint) -> bool { ret n == 3u; }
 
+pure fn is_odd(n: uint) -> bool { ret n % 2u == 1u; }
+
 fn square_if_odd(n: uint) -> option::t<uint> {
     ret if n % 2u == 1u { some(n * n) } else { none };
 }
@@ -269,7 +271,12 @@ fn halve(i: int) -> option::t<int> {
     assert (filter_map(halve, all_odd1) == []);
     assert (filter_map(halve, all_odd2) == []);
     assert (filter_map(halve, mix) == mix_dest);
+}
 
+#[test]
+fn test_filter() {
+    assert filter(is_odd, [1u, 2u, 3u]) == [1u, 3u];
+    assert filter(is_three, [1u, 2u, 4u, 8u, 16u]) == [];
 }
 
 #[test]