diff options
Diffstat (limited to 'src/libcollections')
| -rw-r--r-- | src/libcollections/list.rs | 30 |
1 files changed, 14 insertions, 16 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] |
