diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-07-16 17:35:20 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-07-16 17:36:11 -0700 |
| commit | 8c4f1652ec4dc42d6012d01d7cd31a2181eff965 (patch) | |
| tree | 5d56d7dedee8ce3f2bc01d033b94eb3943568e11 | |
| parent | a52c3e044457aa34d4054bb2734c53a08c3e5d4a (diff) | |
| download | rust-8c4f1652ec4dc42d6012d01d7cd31a2181eff965.tar.gz rust-8c4f1652ec4dc42d6012d01d7cd31a2181eff965.zip | |
Add ivec::zip/unzip
| -rw-r--r-- | src/lib/ivec.rs | 26 | ||||
| -rw-r--r-- | src/test/run-pass/lib-ivec.rs | 18 |
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: |
