Skip to content

Commit 92719e4

Browse files
committed
Clean up zip and unzip in std::ivec
1 parent dfcf997 commit 92719e4

File tree

4 files changed

+25
-30
lines changed

4 files changed

+25
-30
lines changed

src/lib/ivec.rs

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -269,30 +269,25 @@ fn position_pred[T](f: fn(&T) -> bool , v: &[T]) -> option::t[uint] {
269269
ret none[uint];
270270
}
271271

272-
fn unzip[@T, @U](v: &[{_0: T, _1: U}]) -> {_0: [T], _1: [U]} {
273-
let sz = len(v);
274-
if sz == 0u {
275-
ret {_0: ~[], _1: ~[]};
276-
} else {
277-
let rest = slice(v, 1u, sz);
278-
let tl = unzip(rest);
279-
let a = ~[v.(0)._0];
280-
let b = ~[v.(0)._1];
281-
ret {_0: a + tl._0, _1: b + tl._1};
272+
fn unzip[@T, @U](v: &[(T, U)]) -> ([T], [U]) {
273+
let as = ~[], bs = ~[];
274+
for (a, b) in v {
275+
as += ~[a];
276+
bs += ~[b];
282277
}
278+
ret (as, bs);
283279
}
284280

285-
286281
// FIXME make the lengths being equal a constraint
287-
fn zip[@T, @U](v: &[T], u: &[U]) -> [{_0: T, _1: U}] {
288-
let sz = len(v);
282+
fn zip[@T, @U](v: &[T], u: &[U]) -> [(T, U)] {
283+
let zipped = ~[];
284+
let sz = len(v), i = 0u;
289285
assert (sz == len(u));
290-
if sz == 0u {
291-
ret ~[];
292-
} else {
293-
let rest = zip(slice(v, 1u, sz), slice(u, 1u, sz));
294-
ret ~[{_0: v.(0), _1: u.(0)}] + rest;
286+
while i < sz {
287+
zipped += ~[(v.(i), u.(i))];
288+
i += 1u;
295289
}
290+
ret zipped;
296291
}
297292

298293
// Swaps two elements in a vector

src/test/stdtest/ivec.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -314,15 +314,15 @@ fn test_zip_unzip() {
314314
let v2 = ~[4, 5, 6];
315315
let z1 = ivec::zip(v1, v2);
316316

317-
assert ({_0: 1, _1: 4} == z1.(0));
318-
assert ({_0: 2, _1: 5} == z1.(1));
319-
assert ({_0: 3, _1: 6} == z1.(2));
317+
assert ((1, 4) == z1.(0));
318+
assert ((2, 5) == z1.(1));
319+
assert ((3, 6) == z1.(2));
320320

321-
let u1 = ivec::unzip(z1);
321+
let (left, right) = ivec::unzip(z1);
322322

323-
assert ({_0: 1, _1: 4} == {_0: u1._0.(0), _1: u1._1.(0)});
324-
assert ({_0: 2, _1: 5} == {_0: u1._0.(1), _1: u1._1.(1)});
325-
assert ({_0: 3, _1: 6} == {_0: u1._0.(2), _1: u1._1.(2)});
323+
assert ((1, 4) == (left.(0), right.(0)));
324+
assert ((2, 5) == (left.(1), right.(1)));
325+
assert ((3, 6) == (left.(2), right.(2)));
326326
}
327327

328328
#[test]

src/test/stdtest/qsort.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ fn test_simple() {
5050
sort::quick_sort(lteq, names);
5151

5252
let pairs = ivec::zip(expected, ivec::from_mut(names));
53-
for p: {_0: int, _1: int} in pairs {
54-
log #fmt("%d %d", p._0, p._1);
55-
assert (p._0 == p._1);
53+
for (a, b) in pairs {
54+
log #fmt("%d %d", a, b);
55+
assert (a == b);
5656
}
5757
}
5858

src/test/stdtest/test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ fn sort_tests() {
8989
let pairs = ivec::zip(expected, filtered);
9090

9191

92-
for p: {_0: str, _1: test::test_desc} in pairs {
93-
assert (p._0 == p._1.name);
92+
for (a, b) in pairs {
93+
assert (a == b.name);
9494
}
9595
}
9696

0 commit comments

Comments
 (0)