Skip to content

Commit 8309d50

Browse files
committed
core: Add iter::filter_map
1 parent e360ddb commit 8309d50

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

src/libcore/iter.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,16 @@ fn filter<A,IA:iterable<A>>(self: IA, prd: fn@(A) -> bool, blk: fn(A)) {
5757
}
5858
}
5959

60+
fn filter_map<A,B,IA:iterable<A>>(self: IA, cnv: fn@(A) -> option<B>,
61+
blk: fn(B)) {
62+
self.iter {|a|
63+
alt cnv(a) {
64+
some(b) { blk(b) }
65+
none { }
66+
}
67+
}
68+
}
69+
6070
fn map<A,B,IA:iterable<A>>(self: IA, cnv: fn@(A) -> B, blk: fn(B)) {
6171
self.iter {|a|
6272
let b = cnv(a);
@@ -188,6 +198,21 @@ fn test_filter_on_uint_range() {
188198
assert l == [0u, 2u, 4u, 6u, 8u];
189199
}
190200

201+
#[test]
202+
fn test_filter_map() {
203+
fn negativate_the_evens(&&i: int) -> option<int> {
204+
if i % 2 == 0 {
205+
some(-i)
206+
} else {
207+
none
208+
}
209+
}
210+
211+
let l = to_list(bind filter_map(
212+
bind int::range(0, 5, _), negativate_the_evens, _));
213+
assert l == [0, -2, -4];
214+
}
215+
191216
#[test]
192217
fn test_flat_map_with_option() {
193218
fn if_even(&&i: int) -> option<int> {

0 commit comments

Comments
 (0)