core: Add iter::filter_map
This commit is contained in:
parent
e360ddbd65
commit
8309d50ff4
1 changed files with 25 additions and 0 deletions
|
@ -57,6 +57,16 @@ fn filter<A,IA:iterable<A>>(self: IA, prd: fn@(A) -> bool, blk: fn(A)) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn filter_map<A,B,IA:iterable<A>>(self: IA, cnv: fn@(A) -> option<B>,
|
||||||
|
blk: fn(B)) {
|
||||||
|
self.iter {|a|
|
||||||
|
alt cnv(a) {
|
||||||
|
some(b) { blk(b) }
|
||||||
|
none { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn map<A,B,IA:iterable<A>>(self: IA, cnv: fn@(A) -> B, blk: fn(B)) {
|
fn map<A,B,IA:iterable<A>>(self: IA, cnv: fn@(A) -> B, blk: fn(B)) {
|
||||||
self.iter {|a|
|
self.iter {|a|
|
||||||
let b = cnv(a);
|
let b = cnv(a);
|
||||||
|
@ -188,6 +198,21 @@ fn test_filter_on_uint_range() {
|
||||||
assert l == [0u, 2u, 4u, 6u, 8u];
|
assert l == [0u, 2u, 4u, 6u, 8u];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_filter_map() {
|
||||||
|
fn negativate_the_evens(&&i: int) -> option<int> {
|
||||||
|
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]
|
#[test]
|
||||||
fn test_flat_map_with_option() {
|
fn test_flat_map_with_option() {
|
||||||
fn if_even(&&i: int) -> option<int> {
|
fn if_even(&&i: int) -> option<int> {
|
||||||
|
|
Loading…
Reference in a new issue