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; }
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 };
}
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]