summary refs log tree commit diff
path: root/src/libcore/tuple.rs
diff options
context:
space:
mode:
authorErick Tryzelaar <erick.tryzelaar@gmail.com>2012-10-07 16:01:01 -0700
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2012-10-07 17:20:19 -0700
commit91b7a9a529cad2db9503fa469b2e2ce7a86257e6 (patch)
tree953db0c34d69dfc5bc4bd7a1f114aa2710b978de /src/libcore/tuple.rs
parentd301dd3686ddd04845c1e9f5b9254aa3498a8a7b (diff)
downloadrust-91b7a9a529cad2db9503fa469b2e2ce7a86257e6.tar.gz
rust-91b7a9a529cad2db9503fa469b2e2ce7a86257e6.zip
libcore: add first_ref and second_ref to tuples
Diffstat (limited to 'src/libcore/tuple.rs')
-rw-r--r--src/libcore/tuple.rs29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/libcore/tuple.rs b/src/libcore/tuple.rs
index 246ce16c813..899b16eb132 100644
--- a/src/libcore/tuple.rs
+++ b/src/libcore/tuple.rs
@@ -6,13 +6,13 @@
 
 use cmp::{Eq, Ord};
 
-pub trait TupleOps<T,U> {
+pub trait CopyableTuple<T, U> {
     pure fn first() -> T;
     pure fn second() -> U;
     pure fn swap() -> (U, T);
 }
 
-impl<T: Copy, U: Copy> (T, U): TupleOps<T,U> {
+impl<T: Copy, U: Copy> (T, U): CopyableTuple<T, U> {
 
     /// Return the first element of self
     pure fn first() -> T {
@@ -34,6 +34,24 @@ impl<T: Copy, U: Copy> (T, U): TupleOps<T,U> {
 
 }
 
+pub trait ImmutableTuple<T, U> {
+    pure fn first_ref(&self) -> &self/T;
+    pure fn second_ref(&self) -> &self/U;
+}
+
+impl<T, U> (T, U): ImmutableTuple<T, U> {
+    pure fn first_ref(&self) -> &self/T {
+        match *self {
+            (ref t, _) => t,
+        }
+    }
+    pure fn second_ref(&self) -> &self/U {
+        match *self {
+            (_, ref u) => u,
+        }
+    }
+}
+
 pub trait ExtendedTupleOps<A,B> {
     fn zip(&self) -> ~[(A, B)];
     fn map<C>(&self, f: &fn(a: &A, b: &B) -> C) -> ~[C];
@@ -146,6 +164,13 @@ impl<A: Ord, B: Ord, C: Ord> (A, B, C) : Ord {
 }
 
 #[test]
+fn test_tuple_ref() {
+    let (~"foo", ~"bar");
+    assert x.first_ref() == &~"foo";
+    assert x.second_ref() == &~"bar";
+}
+
+#[test]
 #[allow(non_implicitly_copyable_typarams)]
 fn test_tuple() {
     assert (948, 4039.48).first() == 948;