From 3a7a2943ddd1e7e91f625d6459c3e0636ca129cb Mon Sep 17 00:00:00 2001 From: Jesse Ruderman Date: Fri, 23 Sep 2011 19:10:48 -0700 Subject: [PATCH] Add vec::filter --- src/lib/vec.rs | 11 +++++++++++ src/test/stdtest/vec.rs | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/src/lib/vec.rs b/src/lib/vec.rs index 6ca0c9bb61e..fef91259b50 100644 --- a/src/lib/vec.rs +++ b/src/lib/vec.rs @@ -213,6 +213,17 @@ fn filter_map<@T, @U>(f: block(T) -> option::t, 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; } diff --git a/src/test/stdtest/vec.rs b/src/test/stdtest/vec.rs index a9cda6c73d6..b7571d5bf0e 100644 --- a/src/test/stdtest/vec.rs +++ b/src/test/stdtest/vec.rs @@ -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 { ret if n % 2u == 1u { some(n * n) } else { none }; } @@ -269,7 +271,12 @@ fn halve(i: int) -> option::t { 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] -- 2.44.0