hello_fn/list/
linkedlist.rs1#[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}