1use crate::{iter::TreeNode, prelude::TreeNodeMut};
2
3pub struct Node<T> {
41    pub value: T,
43    pub children: Vec<Node<T>>,
45}
46
47impl<T> Node<T> {
48    pub fn new(value: T) -> Self {
58        Self {
59            value,
60            children: Vec::new(),
61        }
62    }
63}
64
65impl<T> TreeNode for Node<T> {
69    fn children(&self) -> impl DoubleEndedIterator<Item = &Self> {
71        self.children.iter()
72    }
73}
74
75impl<T> TreeNodeMut for Node<T> {
79    fn children_mut(&mut self) -> impl DoubleEndedIterator<Item = &mut Self> {
81        self.children.iter_mut()
82    }
83}
84
85#[cfg(test)]
86mod tests {
87    use super::*;
88    use crate::prelude::*;
89
90    #[test]
91    fn test_empty_tree() {
92        let tree: Node<i32> = Node::new(42);
93        let values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
94        assert_eq!(values, vec![42]);
95
96        let values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
97        assert_eq!(values, vec![42]);
98    }
99
100    #[test]
101    fn test_depth_first_traversal() {
102        let tree = Node {
103            value: 1,
104            children: vec![
105                Node {
106                    value: 2,
107                    children: vec![Node::new(4), Node::new(5)],
108                },
109                Node {
110                    value: 3,
111                    children: vec![Node::new(6)],
112                },
113            ],
114        };
115
116        let values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
117        assert_eq!(values, vec![1, 2, 4, 5, 3, 6]);
118    }
119
120    #[test]
121    fn test_breadth_first_traversal() {
122        let tree = Node {
123            value: 1,
124            children: vec![
125                Node {
126                    value: 2,
127                    children: vec![Node::new(4), Node::new(5)],
128                },
129                Node {
130                    value: 3,
131                    children: vec![Node::new(6)],
132                },
133            ],
134        };
135
136        let values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
137        assert_eq!(values, vec![1, 2, 3, 4, 5, 6]);
138    }
139
140    #[test]
141    fn test_mutable_depth_first_traversal() {
142        let mut tree = Node {
143            value: 1,
144            children: vec![Node::new(2), Node::new(3)],
145        };
146
147        let mut iter = tree.iter_mut::<DepthFirst>();
149        while let Some(mut node) = iter.next() {
150            node.value *= 2;
151        }
152
153        let values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
155        assert_eq!(values, vec![2, 4, 6]);
156    }
157
158    #[test]
159    fn test_mutable_breadth_first_traversal() {
160        let mut tree = Node {
161            value: 1,
162            children: vec![
163                Node {
164                    value: 2,
165                    children: vec![Node::new(4)],
166                },
167                Node::new(3),
168            ],
169        };
170
171        let mut iter = tree.iter_mut::<BreadthFirst>();
173        while let Some(mut node) = iter.next() {
174            if node.value == 2 {
175                node.children.push(Node::new(10));
176            }
177            node.value += 10;
178        }
179
180        let values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
182        assert_eq!(values, vec![11, 12, 13, 14, 20]);
183    }
184
185    #[test]
186    fn test_tree_modification() {
187        let mut tree = Node {
189            value: 1,
190            children: vec![Node::new(2), Node::new(3)],
191        };
192
193        let initial_values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
195        assert_eq!(initial_values, vec![1, 2, 3]);
196
197        tree.children[0].children.push(Node::new(20));
199
200        tree.children[1].children.push(Node::new(30));
201
202        let final_values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
204        assert_eq!(final_values, vec![1, 2, 20, 3, 30]);
205    }
206
207    #[test]
208    fn test_complex_tree_traversal() {
209        let mut tree = Node {
211            value: 1,
212            children: vec![
213                Node {
214                    value: 2,
215                    children: vec![
216                        Node {
217                            value: 4,
218                            children: vec![Node::new(7)],
219                        },
220                        Node::new(5),
221                    ],
222                },
223                Node {
224                    value: 3,
225                    children: vec![Node {
226                        value: 6,
227                        children: vec![Node::new(8), Node::new(9)],
228                    }],
229                },
230            ],
231        };
232
233        let df_values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
235        assert_eq!(df_values, vec![1, 2, 4, 7, 5, 3, 6, 8, 9]);
236
237        let mut df_values_mut = vec![];
239        let mut iter = tree.iter_mut::<DepthFirst>();
240        while let Some(node) = iter.next() {
241            df_values_mut.push(node.value);
242        }
243        assert_eq!(df_values_mut, vec![1, 2, 4, 7, 5, 3, 6, 8, 9]);
244
245        let bf_values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
247        assert_eq!(bf_values, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);
248
249        let mut bf_values_mut = vec![];
251        let mut iter = tree.iter_mut::<BreadthFirst>();
252        while let Some(node) = iter.next() {
253            bf_values_mut.push(node.value);
254        }
255        assert_eq!(bf_values_mut, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);
256    }
257}