tree_iter/
tree.rs

1use crate::{iter::TreeNode, prelude::TreeNodeMut};
2
3/// A generic tree node implementation.
4///
5/// This struct provides a simple implementation of a tree node with a value and a vector of children.
6/// It implements both `TreeNode` and `TreeNodeMut` traits, allowing it to be used with both
7/// immutable and mutable iterators.
8///
9/// # Type Parameters
10///
11/// * `T` - The type of value stored in each node.
12///
13/// # Examples
14///
15/// ```rust
16/// use tree_iter::tree::Node;
17/// use tree_iter::prelude::*;
18///
19/// // Create a simple tree
20/// let tree = Node {
21///     value: 1,
22///     children: vec![
23///         Node {
24///             value: 2,
25///             children: vec![],
26///         },
27///         Node {
28///             value: 3,
29///             children: vec![],
30///         },
31///     ],
32/// };
33///
34/// // Traverse in depth-first order
35/// let values: Vec<i32> = tree.iter::<DepthFirst>()
36///                           .map(|node| node.value)
37///                           .collect();
38/// assert_eq!(values, vec![1, 2, 3]);
39/// ```
40pub struct Node<T> {
41    /// The value stored in this node.
42    pub value: T,
43    /// The children of this node.
44    pub children: Vec<Node<T>>,
45}
46
47impl<T> Node<T> {
48    /// Creates a new node with the given value and no children.
49    ///
50    /// # Parameters
51    ///
52    /// * `value` - The value to store in the node.
53    ///
54    /// # Returns
55    ///
56    /// A new `Node` with the given value and an empty children vector.
57    pub fn new(value: T) -> Self {
58        Self {
59            value,
60            children: Vec::new(),
61        }
62    }
63}
64
65/// Implementation of `TreeNode` for `Node<T>`.
66///
67/// This allows immutable iteration over the tree.
68impl<T> TreeNode for Node<T> {
69    /// Returns an iterator over the children of this node.
70    fn children(&self) -> impl DoubleEndedIterator<Item = &Self> {
71        self.children.iter()
72    }
73}
74
75/// Implementation of `TreeNodeMut` for `Node<T>`.
76///
77/// This allows mutable iteration over the tree.
78impl<T> TreeNodeMut for Node<T> {
79    /// Returns a mutable iterator over the children of this node.
80    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        // Double each value in the tree
148        let mut iter = tree.iter_mut::<DepthFirst>();
149        while let Some(mut node) = iter.next() {
150            node.value *= 2;
151        }
152
153        // Verify values were changed
154        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        // Add 10 to each value in the tree, and add a child to node with value 2
172        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        // Verify values were changed in breadth-first order
181        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        // Create a tree manually with specific structure
188        let mut tree = Node {
189            value: 1,
190            children: vec![Node::new(2), Node::new(3)],
191        };
192
193        // Verify initial structure
194        let initial_values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
195        assert_eq!(initial_values, vec![1, 2, 3]);
196
197        // Modify the tree directly, avoiding iterator with borrow issues
198        tree.children[0].children.push(Node::new(20));
199
200        tree.children[1].children.push(Node::new(30));
201
202        // Verify the modified structure
203        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        // Create a more complex tree
210        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        // Test depth-first traversal
234        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        // Test mutable depth-first traversal
238        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        // Test breadth-first traversal
246        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        // Test mutable breadth-first traversal
250        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}