hello_fn/list/
linkedlist.rs

1#[derive(PartialEq, Clone, Debug, Default)]
2pub struct LinkedList<T>
3where
4    T: PartialEq,
5{
6    pub value: T,
7    pub next: Option<Box<LinkedList<T>>>,
8}
9
10impl<T> LinkedList<T>
11where
12    T: PartialEq + Default,
13{
14    pub fn new_node(value: T) -> LinkedList<T> {
15        LinkedList { value, next: None }
16    }
17    pub fn add_node(&mut self, value: T) -> &mut LinkedList<T> {
18        let new_node = LinkedList::new_node(value);
19        self.next = Some(Box::new(new_node));
20        self.next.as_deref_mut().unwrap()
21    }
22}
23
24impl<T> Iterator for LinkedList<T>
25where
26    T: Clone + PartialEq + Default,
27{
28    type Item = T;
29
30    fn next(&mut self) -> Option<Self::Item> {
31        let current = std::mem::take(self);
32        if let Some(next) = current.next {
33            *self = *next;
34        }
35        if current.value == Default::default() {
36            None
37        } else {
38            Some(current.value)
39        }
40    }
41}
42
43#[cfg(test)]
44mod tests {
45
46    use super::*;
47
48    #[test]
49    fn test_new() {
50        let text_node = LinkedList::new_node(String::from("Hello"));
51        assert_eq!(text_node.value, "Hello");
52        assert_eq!(text_node.next, None);
53    }
54
55    #[test]
56    fn test_add_node() {
57        let mut head = LinkedList::new_node("Hello");
58        head.add_node("World").add_node("I").add_node("Am");
59        assert_eq!(head.value, "Hello");
60        let next = head.next;
61        match next {
62            Some(node) => {
63                assert_eq!(node.value, "World");
64                let next = node.next;
65                match next {
66                    Some(node) => {
67                        assert_eq!(node.value, "I")
68                    }
69                    None => (),
70                }
71            }
72            None => (),
73        }
74    }
75
76    #[test]
77    fn test_iterator() {
78        let mut head = LinkedList::new_node("Hello");
79        head.add_node("World").add_node("I").add_node("Am");
80        let mut iterator = head.into_iter();
81        assert!(iterator.next() == Some("Hello"));
82        assert!(iterator.next() == Some("World"));
83        assert!(iterator.next() == Some("I"));
84        assert!(iterator.next() == Some("Am"));
85    }
86}