orx_tree/traversal/depth_first/
dfs_enumeration.rs

1use crate::traversal::enumeration::Enumeration;
2use crate::traversal::enumerations::{DepthSiblingIdxVal, DepthVal, SiblingIdxVal, Val};
3
4pub trait DepthFirstEnumeration: Enumeration {
5    fn from_root<D>(root: D) -> Self::Item<D>;
6
7    fn node_value<D>(element: &Self::Item<D>) -> &D;
8
9    fn children<D>(
10        parent: &Self::Item<D>,
11        children_data: impl DoubleEndedIterator<Item = D> + ExactSizeIterator,
12    ) -> impl DoubleEndedIterator<Item = Self::Item<D>> + ExactSizeIterator;
13}
14
15// impl
16
17impl DepthFirstEnumeration for Val {
18    fn from_root<D>(root: D) -> Self::Item<D> {
19        root
20    }
21
22    #[inline(always)]
23    fn node_value<D>(element: &Self::Item<D>) -> &D {
24        element
25    }
26
27    #[inline(always)]
28    fn children<D>(
29        _: &Self::Item<D>,
30        children_data: impl DoubleEndedIterator<Item = D> + ExactSizeIterator,
31    ) -> impl DoubleEndedIterator<Item = Self::Item<D>> + ExactSizeIterator {
32        children_data
33    }
34}
35
36impl DepthFirstEnumeration for DepthVal {
37    fn from_root<D>(root: D) -> Self::Item<D> {
38        (0, root)
39    }
40
41    #[inline(always)]
42    fn node_value<D>(element: &Self::Item<D>) -> &D {
43        &element.1
44    }
45
46    #[inline(always)]
47    fn children<D>(
48        parent: &Self::Item<D>,
49        children_data: impl DoubleEndedIterator<Item = D> + ExactSizeIterator,
50    ) -> impl DoubleEndedIterator<Item = Self::Item<D>> + ExactSizeIterator {
51        let depth = parent.0 + 1;
52        children_data.map(move |data| (depth, data))
53    }
54}
55
56impl DepthFirstEnumeration for SiblingIdxVal {
57    fn from_root<D>(root: D) -> Self::Item<D> {
58        (0, root)
59    }
60
61    #[inline(always)]
62    fn node_value<D>(element: &Self::Item<D>) -> &D {
63        &element.1
64    }
65
66    #[inline(always)]
67    fn children<D>(
68        _: &Self::Item<D>,
69        children_data: impl DoubleEndedIterator<Item = D> + ExactSizeIterator,
70    ) -> impl DoubleEndedIterator<Item = Self::Item<D>> + ExactSizeIterator {
71        children_data.enumerate()
72    }
73}
74
75impl DepthFirstEnumeration for DepthSiblingIdxVal {
76    fn from_root<D>(root: D) -> Self::Item<D> {
77        (0, 0, root)
78    }
79
80    #[inline(always)]
81    fn node_value<D>(element: &Self::Item<D>) -> &D {
82        &element.2
83    }
84
85    #[inline(always)]
86    fn children<D>(
87        parent: &Self::Item<D>,
88        children_data: impl DoubleEndedIterator<Item = D> + ExactSizeIterator,
89    ) -> impl DoubleEndedIterator<Item = Self::Item<D>> + ExactSizeIterator {
90        let depth = parent.0 + 1;
91        children_data
92            .enumerate()
93            .map(move |(sibling_idx, data)| (depth, sibling_idx, data))
94    }
95}