runningwater před 2 roky
rodič
revize
376807383b
1 změnil soubory, kde provedl 33 přidání a 0 odebrání
  1. 33 0
      src/second.rs

+ 33 - 0
src/second.rs

@@ -70,6 +70,26 @@ impl<T> Iterator for IntoIter<T> {
     }
 }
 
+pub struct Iter<'a, T> {
+    next: Option<&'a Node<T>>,
+}
+impl<T> List<T> {
+    pub fn iter<'a>(&'a self) -> Iter<'a, T> {
+        Iter {
+            next: self.head.as_deref(),
+        }
+    }
+}
+impl<'a, T> Iterator for Iter<'a, T> {
+    type Item = &'a T;
+    fn next(&mut self) -> Option<Self::Item> {
+        self.next.map(|node| {
+            self.next = node.next.as_deref();
+            &node.elem
+        })
+    }
+}
+
 #[cfg(test)]
 mod test {
     use super::List;
@@ -134,4 +154,17 @@ mod test {
         assert_eq!(iter.next(), Some(1));
         assert_eq!(iter.next(), None);
     }
+
+    #[test]
+    fn iter() {
+        let mut list = List::new();
+        list.push(1);
+        list.push(2);
+        list.push(3);
+
+        let mut iter = list.iter();
+        assert_eq!(iter.next(), Some(3).as_ref());
+        assert_eq!(iter.next(), Some(2).as_ref());
+        assert_eq!(iter.next(), Some(1).as_ref());
+    }
 }