diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-06-15 12:46:30 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-06-15 15:45:41 -0700 |
| commit | b8a5440b2de600c47ed9c9c3d7a376807b57a579 (patch) | |
| tree | e47bed55e9dd20cf1bab5b50a8c6dc73e30fc931 /src/lib | |
| parent | 95bdedf12d5f7e0e5bd2fc015e845449c3d1741d (diff) | |
| download | rust-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.rs | 64 | ||||
| -rw-r--r-- | src/lib/std.rc | 1 |
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; |
