about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-07-16 17:35:20 -0700
committerBrian Anderson <banderson@mozilla.com>2011-07-16 17:36:11 -0700
commit8c4f1652ec4dc42d6012d01d7cd31a2181eff965 (patch)
tree5d56d7dedee8ce3f2bc01d033b94eb3943568e11
parenta52c3e044457aa34d4054bb2734c53a08c3e5d4a (diff)
downloadrust-8c4f1652ec4dc42d6012d01d7cd31a2181eff965.tar.gz
rust-8c4f1652ec4dc42d6012d01d7cd31a2181eff965.zip
Add ivec::zip/unzip
-rw-r--r--src/lib/ivec.rs26
-rw-r--r--src/test/run-pass/lib-ivec.rs18
2 files changed, 44 insertions, 0 deletions
diff --git a/src/lib/ivec.rs b/src/lib/ivec.rs
index 10f5e33505b..677fddc35c5 100644
--- a/src/lib/ivec.rs
+++ b/src/lib/ivec.rs
@@ -241,6 +241,32 @@ fn find[T](fn(&T) -> bool  f, &T[] v) -> option::t[T] {
     ret none[T];
 }
 
+fn unzip[T, U](&tup(T, U)[] v) -> tup(T[], U[]) {
+    auto sz = len[tup(T, U)](v);
+    if (sz == 0u) {
+        ret tup(~[], ~[]);
+    } else {
+        auto rest = slice[tup(T, U)](v, 1u, sz);
+        auto tl = unzip[T, U](rest);
+        auto a = ~[v.(0)._0];
+        auto b = ~[v.(0)._1];
+        ret tup(a + tl._0, b + tl._1);
+    }
+}
+
+
+// FIXME make the lengths being equal a constraint
+fn zip[T, U](&T[] v, &U[] u) -> tup(T, U)[] {
+    auto sz = len[T](v);
+    assert (sz == len[U](u));
+    if (sz == 0u) {
+        ret ~[];
+    } else {
+        auto rest = zip[T, U](slice[T](v, 1u, sz), slice[U](u, 1u, sz));
+        ret ~[tup(v.(0), u.(0))] + rest;
+    }
+}
+
 mod unsafe {
     type ivec_repr = rec(mutable uint fill,
                          mutable uint alloc,
diff --git a/src/test/run-pass/lib-ivec.rs b/src/test/run-pass/lib-ivec.rs
index 6de08db33b8..14fcd831399 100644
--- a/src/test/run-pass/lib-ivec.rs
+++ b/src/test/run-pass/lib-ivec.rs
@@ -262,6 +262,23 @@ fn test_any_and_all() {
     assert (!ivec::all(is_three, ~[ 3u, 3u, 0u, 1u, 2u ]));
 }
 
+#[test]
+fn test_zip_unzip() {
+    auto v1 = ~[1, 2, 3];
+    auto v2 = ~[4, 5, 6];
+    auto z1 = ivec::zip(v1, v2);
+
+    assert tup(1, 4) == z1.(0);
+    assert tup(2, 5) == z1.(1);
+    assert tup(3, 6) == z1.(2);
+
+    auto u1 = ivec::unzip(z1);
+
+    assert tup(1, 4) == tup(u1._0.(0), u1._1.(0));
+    assert tup(2, 5) == tup(u1._0.(1), u1._1.(1));
+    assert tup(3, 6) == tup(u1._0.(2), u1._1.(2));
+}
+
 fn main() {
     test_reserve_and_on_heap();
     test_unsafe_ptrs();
@@ -291,6 +308,7 @@ fn main() {
     test_filter_map();
     test_foldl();
     test_any_and_all();
+    test_zip_unzip();
 }
 
 // Local Variables: