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 {