diff --git a/src/libcore/iter.rs b/src/libcore/iter.rs index e1f9c4ec548..e9327a26017 100644 --- a/src/libcore/iter.rs +++ b/src/libcore/iter.rs @@ -57,6 +57,16 @@ fn filter>(self: IA, prd: fn@(A) -> bool, blk: fn(A)) { } } +fn filter_map>(self: IA, cnv: fn@(A) -> option, + blk: fn(B)) { + self.iter {|a| + alt cnv(a) { + some(b) { blk(b) } + none { } + } + } +} + fn map>(self: IA, cnv: fn@(A) -> B, blk: fn(B)) { self.iter {|a| let b = cnv(a); @@ -188,6 +198,21 @@ fn test_filter_on_uint_range() { assert l == [0u, 2u, 4u, 6u, 8u]; } +#[test] +fn test_filter_map() { + fn negativate_the_evens(&&i: int) -> option { + if i % 2 == 0 { + some(-i) + } else { + none + } + } + + let l = to_list(bind filter_map( + bind int::range(0, 5, _), negativate_the_evens, _)); + assert l == [0, -2, -4]; +} + #[test] fn test_flat_map_with_option() { fn if_even(&&i: int) -> option {