about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libcollections/list.rs30
-rw-r--r--src/test/run-pass/non-boolean-pure-fns.rs10
2 files changed, 19 insertions, 21 deletions
diff --git a/src/libcollections/list.rs b/src/libcollections/list.rs
index 05e60d07df8..a922c247b2f 100644
--- a/src/libcollections/list.rs
+++ b/src/libcollections/list.rs
@@ -53,6 +53,14 @@ impl<T> List<T> {
             next: None
         }
     }
+
+    /// Returns the first element of a list
+    pub fn head<'a>(&'a self) -> Option<&'a T> {
+        match *self {
+          Nil => None,
+          Cons(ref head, _) => Some(head)
+        }
+    }
 }
 
 impl<T> Container for List<T> {
@@ -78,15 +86,6 @@ pub fn tail<T>(list: @List<T>) -> @List<T> {
     }
 }
 
-/// Returns the first element of a list
-pub fn head<T:Clone>(list: @List<T>) -> T {
-    match *list {
-      Cons(ref head, _) => (*head).clone(),
-      // makes me sad
-      _ => fail!("head invoked on empty list")
-    }
-}
-
 /// Appends one list to another
 pub fn append<T:Clone + 'static>(list: @List<T>, other: @List<T>) -> @List<T> {
     match *list {
@@ -118,7 +117,7 @@ fn push<T:Clone>(ll: &mut @list<T>, vv: T) {
 
 #[cfg(test)]
 mod tests {
-    use list::{List, Nil, head, tail};
+    use list::{List, Nil, tail};
     use list;
 
     #[test]
@@ -145,14 +144,13 @@ mod tests {
     #[test]
     fn test_from_vec() {
         let list = @List::from_vec([0, 1, 2]);
+        assert_eq!(list.head().unwrap(), &0);
 
-        assert_eq!(head(list), 0);
-
-        let tail_l = tail(list);
-        assert_eq!(head(tail_l), 1);
+        let mut tail = tail(list);
+        assert_eq!(tail.head().unwrap(), &1);
 
-        let tail_tail_l = tail(tail_l);
-        assert_eq!(head(tail_tail_l), 2);
+        tail = tail(tail);
+        assert_eq!(tail.head().unwrap(), &2);
     }
 
     #[test]
diff --git a/src/test/run-pass/non-boolean-pure-fns.rs b/src/test/run-pass/non-boolean-pure-fns.rs
index 9cbf80c3105..66bb2e702be 100644
--- a/src/test/run-pass/non-boolean-pure-fns.rs
+++ b/src/test/run-pass/non-boolean-pure-fns.rs
@@ -14,19 +14,19 @@
 
 extern crate collections;
 
-use collections::list::{List, Cons, Nil, head};
+use collections::list::{List, Cons, Nil};
 
-fn pure_length_go<T:Clone>(ls: @List<T>, acc: uint) -> uint {
+fn pure_length_go<T>(ls: @List<T>, acc: uint) -> uint {
     match *ls { Nil => { acc } Cons(_, tl) => { pure_length_go(tl, acc + 1u) } }
 }
 
-fn pure_length<T:Clone>(ls: @List<T>) -> uint { pure_length_go(ls, 0u) }
+fn pure_length<T>(ls: @List<T>) -> uint { pure_length_go(ls, 0u) }
 
-fn nonempty_list<T:Clone>(ls: @List<T>) -> bool { pure_length(ls) > 0u }
+fn nonempty_list<T>(ls: @List<T>) -> bool { pure_length(ls) > 0u }
 
 fn safe_head<T:Clone>(ls: @List<T>) -> T {
     assert!(!ls.is_empty());
-    return head(ls);
+    return ls.head().unwrap().clone();
 }
 
 pub fn main() {