Skip to content

Commit e56ccfa

Browse files
committed
---
yaml --- r: 3597 b: refs/heads/master c: 8261d2e h: refs/heads/master i: 3595: 9d79458 v: v3
1 parent 08fcb5b commit e56ccfa

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

[refs]

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: ee5d7bbc86b63015089a4907afc4c20c1c0559c9
2+
refs/heads/master: 8261d2e6fb32dd4e811d33b3ef40abde8e67ae3d

trunk/src/lib/ivec.rs

+12
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,18 @@ fn map[T,U](fn(&T)->U f, &T[mutable?] v) -> U[] {
171171
ret result;
172172
}
173173

174+
fn filter_map[T,U](fn(&T)->option::t[U] f, &T[mutable?] v) -> U[] {
175+
auto result = ~[];
176+
for (T elem in v) {
177+
auto elem2 = elem; // satisfies alias checker
178+
alt (f(elem2)) {
179+
case (none) { /* no-op */ }
180+
case (some(?result_elem)) { result += ~[result_elem]; }
181+
}
182+
}
183+
ret result;
184+
}
185+
174186
fn any[T](fn(&T)->bool f, &T[] v) -> bool {
175187
for (T elem in v) { if (f(elem)) { ret true; } }
176188
ret false;

trunk/src/test/run-pass/lib-ivec.rs

+23
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
use std;
44
import std::ivec;
5+
import std::option;
56
import std::option::none;
67
import std::option::some;
78

@@ -11,6 +12,10 @@ fn square_alias(&uint n) -> uint { ret n * n; }
1112

1213
pred is_three(&uint n) -> bool { ret n == 3u; }
1314

15+
fn square_if_odd(&uint n) -> option::t[uint] {
16+
ret if (n % 2u == 1u) { some(n * n) } else { none };
17+
}
18+
1419
fn test_reserve_and_on_heap() {
1520
let int[] v = ~[ 1, 2 ];
1621
assert (!ivec::on_heap(v));
@@ -188,6 +193,23 @@ fn test_map() {
188193
assert (w.(4) == 25u);
189194
}
190195

196+
fn test_filter_map() {
197+
// Test on-stack filter-map.
198+
auto v = ~[ 1u, 2u, 3u ];
199+
auto w = ivec::filter_map(square_if_odd, v);
200+
assert (ivec::len(w) == 2u);
201+
assert (w.(0) == 1u);
202+
assert (w.(1) == 9u);
203+
204+
// Test on-heap filter-map.
205+
v = ~[ 1u, 2u, 3u, 4u, 5u ];
206+
w = ivec::filter_map(square_if_odd, v);
207+
assert (ivec::len(w) == 3u);
208+
assert (w.(0) == 1u);
209+
assert (w.(1) == 9u);
210+
assert (w.(2) == 25u);
211+
}
212+
191213
fn test_any_and_all() {
192214
assert (ivec::any(is_three, ~[ 1u, 2u, 3u ]));
193215
assert (!ivec::any(is_three, ~[ 0u, 1u, 2u ]));
@@ -220,6 +242,7 @@ fn main() {
220242

221243
// Functional utilities
222244
test_map();
245+
test_filter_map();
223246
test_any_and_all();
224247
}
225248

0 commit comments

Comments
 (0)