Remove all uses of tuples from the compiler and stdlib

This commit is contained in:
Marijn Haverbeke 2011-07-26 14:06:02 +02:00
parent e123366bff
commit aea537779e
45 changed files with 759 additions and 723 deletions

View file

@ -266,29 +266,29 @@ fn foldl[T, U](fn(&U, &T) -> U p, &U z, &vec[T] v) -> U {
}
}
fn unzip[T, U](&vec[tup(T, U)] v) -> tup(vec[T], vec[U]) {
auto sz = len[tup(T, U)](v);
fn unzip[T, U](&vec[rec(T _0, U _1)] v) -> rec(vec[T] _0, vec[U] _1) {
auto sz = len(v);
if (sz == 0u) {
ret tup(alloc[T](0u), alloc[U](0u));
ret rec(_0=alloc[T](0u), _1=alloc[U](0u));
} else {
auto rest = slice[tup(T, U)](v, 1u, sz);
auto rest = slice(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);
ret rec(_0=a + tl._0, _1=b + tl._1);
}
}
// FIXME make the lengths being equal a constraint
fn zip[T, U](&vec[T] v, &vec[U] u) -> vec[tup(T, U)] {
auto sz = len[T](v);
assert (sz == len[U](u));
fn zip[T, U](&vec[T] v, &vec[U] u) -> vec[rec(T _0, U _1)] {
auto sz = len(v);
assert (sz == len(u));
if (sz == 0u) {
ret alloc[tup(T, U)](0u);
ret alloc(0u);
} else {
auto rest = zip[T, U](slice[T](v, 1u, sz), slice[U](u, 1u, sz));
vec::push(rest, tup(v.(0), u.(0)));
auto rest = zip(slice(v, 1u, sz), slice(u, 1u, sz));
vec::push(rest, rec(_0=v.(0), _1=u.(0)));
ret rest;
}
}