flange_flat_tree/tree/flange/
flanged_tree.rs1use crate::navigator::Navigator;
2use crate::tree::subtree::subtree_impl::SubtreeImpl;
3use crate::tree::tree_data::TreeData;
4use crate::{Subtree, Tree};
5
6pub struct FlangedTree<TD, A>
7where
8 TD: TreeData,
9{
10 base: TD,
11 data: Vec<A>,
12}
13
14impl<TD, A> FlangedTree<TD, A>
15where
16 TD: TreeData,
17{
18 pub fn new(base: TD, data: Vec<A>) -> Self {
19 FlangedTree { base, data }
20 }
21
22 pub fn replace_map_flange<'a, B, F>(&'a self, mapf: F) -> FlangedTree<TD, B>
23 where
24 F: Fn(<FlangedTree<TD, A> as Tree<'a>>::Node) -> B,
25 {
26 let mut res = Vec::with_capacity(self.node_count());
28
29 self.for_each(|s| {
30 res.push(mapf(s.value()));
31 });
32 FlangedTree::new(self.base, res)
33 }
34
35 pub fn get_flange(&self, index: usize) -> &A {
36 &self.data[index]
37 }
38
39 pub fn get_flange_mut(&mut self, index: usize) -> &mut A {
40 &mut self.data[index]
41 }
42}
43
44impl<'a, TD, Node, A> TreeData for &'a FlangedTree<TD, A>
45where
46 TD: TreeData<Node = Node>,
47{
48 type Node = (Node, &'a A);
49
50 fn get(self, index: usize) -> Self::Node {
51 (self.base.get(index), &self.data[index])
52 }
53
54 fn count(self) -> usize {
55 self.base.count()
56 }
57
58 fn get_nav(&self) -> &Navigator {
59 self.base.get_nav()
60 }
61}
62
63impl<'a, TD, A> Tree<'a> for FlangedTree<TD, A>
64where
65 A: 'a,
66 TD: TreeData + 'a,
67{
68 type Node = (TD::Node, &'a A);
69 type SubtreeType = SubtreeImpl<&'a FlangedTree<TD, A>>;
70
71 fn at_pos(&'a self, index: usize) -> Self::SubtreeType {
72 SubtreeImpl::new(self, index)
73 }
74 fn get_nav(&self) -> &Navigator {
75 self.base.get_nav()
76 }
77}