about summary refs log tree commit diff
path: root/src/rustdoc/par.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/rustdoc/par.rs')
-rw-r--r--src/rustdoc/par.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/rustdoc/par.rs b/src/rustdoc/par.rs
new file mode 100644
index 00000000000..861dea83bc6
--- /dev/null
+++ b/src/rustdoc/par.rs
@@ -0,0 +1,31 @@
+export anymap, seqmap, parmap;
+
+fn anymap<T:send, U:send>(v: [T], f: fn(T) -> U) -> [U] {
+    seqmap(v, f)
+}
+
+fn seqmap<T, U>(v: [T], f: fn(T) -> U) -> [U] {
+    vec::map(v, f)
+}
+
+fn parmap<T:send, U:send>(v: [T], f: fn~(T) -> U) -> [U] unsafe {
+    let futures = vec::map(v) {|elt|
+        let po = comm::port();
+        let ch = comm::chan(po);
+        let addr = ptr::addr_of(elt);
+        task::spawn {||
+            comm::send(ch, f(*addr));
+        }
+        po
+    };
+    vec::map(futures) {|future|
+        comm::recv(future)
+    }
+}
+
+#[test]
+fn test_parallel_map() {
+    let i = [1, 2, 3, 4];
+    let j = parmap(i) {|e| e + 1 };
+    assert j == [2, 3, 4, 5];
+}
\ No newline at end of file