about summary refs log tree commit diff
path: root/src/lib
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-06-15 12:46:30 -0700
committerBrian Anderson <banderson@mozilla.com>2011-06-15 15:45:41 -0700
commitb8a5440b2de600c47ed9c9c3d7a376807b57a579 (patch)
treee47bed55e9dd20cf1bab5b50a8c6dc73e30fc931 /src/lib
parent95bdedf12d5f7e0e5bd2fc015e845449c3d1741d (diff)
downloadrust-b8a5440b2de600c47ed9c9c3d7a376807b57a579.tar.gz
rust-b8a5440b2de600c47ed9c9c3d7a376807b57a579.zip
stdlib: Add an either module
Like Haskell's, with left and right tags, various conversion functions
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/either.rs64
-rw-r--r--src/lib/std.rc1
2 files changed, 65 insertions, 0 deletions
diff --git a/src/lib/either.rs b/src/lib/either.rs
new file mode 100644
index 00000000000..12ccbb2bbfb
--- /dev/null
+++ b/src/lib/either.rs
@@ -0,0 +1,64 @@
+import option;
+import option::some;
+import option::none;
+
+tag t[T, U] {
+    left(T);
+    right(U);
+}
+
+type operator[T, U] = fn(&T) -> U;
+
+fn either[T, U, V](&operator[T, V] f_left,
+                   &operator[U, V] f_right,
+                   &t[T, U] value) -> V {
+    alt (value) {
+        case (left(?l)) { f_left(l) }
+        case (right(?r)) { f_right(r) }
+    }
+}
+
+fn lefts[T, U](&vec[t[T, U]] eithers) -> vec[T] {
+    let vec[T] result = [];
+    for (t[T, U] elt in eithers) {
+        alt (elt) {
+            case (left(?l)) { result += [l] }
+            case (_) { /* fallthrough */ }
+        }
+    }
+    ret result;
+}
+
+fn rights[T, U](&vec[t[T, U]] eithers) -> vec[U] {
+    let vec[U] result = [];
+    for (t[T, U] elt in eithers) {
+        alt (elt) {
+            case (right(?r)) { result += [r] }
+            case (_) { /* fallthrough */ }
+        }
+    }
+    ret result;
+}
+
+fn partition[T, U](&vec[t[T, U]] eithers) -> tup(vec[T], vec[U]) {
+    let vec[T] lefts = [];
+    let vec[U] rights = [];
+    for (t[T, U] elt in eithers) {
+        alt (elt) {
+            case (left(?l)) { lefts += [l] }
+            case (right(?r)) { rights += [r] }
+        }
+    }
+    ret tup(lefts, rights);
+}
+
+//
+// Local Variables:
+// mode: rust
+// fill-column: 78;
+// indent-tabs-mode: nil
+// c-basic-offset: 4
+// buffer-file-coding-system: utf-8-unix
+// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
+// End:
+//
diff --git a/src/lib/std.rc b/src/lib/std.rc
index 60cecd7cf68..26d36257bd5 100644
--- a/src/lib/std.rc
+++ b/src/lib/std.rc
@@ -22,6 +22,7 @@ mod task;
 
 // Utility modules.
 
+mod either;
 mod option;
 mod util;