about summary refs log tree commit diff
path: root/src/lib
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2010-11-09 15:35:40 -0800
committerPatrick Walton <pcwalton@mimiga.net>2010-11-09 15:38:42 -0800
commit3e482d5f69ffb56f0503e783b50599ec0d873dec (patch)
tree0ecf537aee28d13858d193b49cab130d8dbaa892 /src/lib
parent89946609f2de815ea87df3b001fff0caf9efa0d5 (diff)
downloadrust-3e482d5f69ffb56f0503e783b50599ec0d873dec.tar.gz
rust-3e482d5f69ffb56f0503e783b50599ec0d873dec.zip
Implement a map2() function in std._vec
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/_vec.rs18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/lib/_vec.rs b/src/lib/_vec.rs
index 6fa0ed425ac..2ffe8bad08b 100644
--- a/src/lib/_vec.rs
+++ b/src/lib/_vec.rs
@@ -1,6 +1,8 @@
 import vbuf = rustrt.vbuf;
 import std.option;
 
+type operator2[T,U,V] = fn(&T, &U) -> V;
+
 native "rust" mod rustrt {
     type vbuf;
 
@@ -142,6 +144,22 @@ fn map[T, U](&option.operator[T,U] f, &vec[T] v) -> vec[U] {
     ret u;
 }
 
+fn map2[T,U,V](&operator2[T,U,V] f, &vec[T] v0, &vec[U] v1) -> vec[V] {
+    auto v0_len = len[T](v0);
+    if (v0_len != len[U](v1)) {
+        fail;
+    }
+
+    let vec[V] u = alloc[V](v0_len);
+    auto i = 0u;
+    while (i < v0_len) {
+        u += f(v0.(i), v1.(i));
+        i += 1u;
+    }
+
+    ret u;
+}
+
 // Local Variables:
 // mode: rust;
 // fill-column: 78;