1use std::collections::BTreeMap;
2use std::ops::{Deref, DerefMut};
3
4pub trait KeyFactory<K> {
5 fn id(&self) -> K;
6 fn child_of(&self, parent: &Self) -> bool;
7 fn new_parent(&self) -> Self;
8}
9
10pub struct ArenaNode<E> {
11 element: E,
12 parent: Option<usize>,
13 children: Vec<usize>,
14}
15
16impl <E> ArenaNode<E> {
17 fn new(element: E, parent: Option<usize>) -> Self {
18 Self { element, parent, children: Default::default() }
19 }
20
21 pub fn element(&self) -> &E {
22 &self.element
23 }
24
25 pub fn element_mut(&mut self) -> &mut E {
26 &mut self.element
27 }
28
29 pub fn parent_index(&self) -> &Option<usize> {
30 &self.parent
31 }
32
33 pub fn parent_mut<'a, K>(&self, tree: &'a mut ArenaTree<E, K>) -> Option<&'a mut ArenaNode<E>> {
34 if let Some(parent_index) = self.parent {
35 return tree.nodes.get_mut(parent_index);
36 }
37 None
38 }
39
40 pub fn child_indexes(&self) -> &Vec<usize> {
41 &self.children
42 }
43}
44
45pub struct ArenaTree<E, K> {
46 nodes: Vec<ArenaNode<E>>,
47 mapping: BTreeMap<K, usize>,
48}
49
50impl<E: KeyFactory<K>, K: Ord + Clone> ArenaTree<E, K> {
51 pub fn new(element: E) -> Self {
52 let id = element.id();
53 let index = 0;
54 let node = ArenaNode::new(element, None);
55 Self { nodes: vec![node], mapping: BTreeMap::from([(id, index)]) }
56 }
57
58 pub fn insert(&mut self, element: E) -> (K, usize) {
59 let id = element.id();
60 let index = self.nodes.len();
61 let parent_index = self.find_parent(&element);
62 let node = ArenaNode::new(element, parent_index);
63 self.nodes.push(node);
64 self.mapping.insert(id.clone(), index);
65 (id, index)
66 }
67
68 fn find_parent(&self, element: &E) -> Option<usize> {
69 self.nodes.iter().enumerate()
70 .find(|&(_, node)| element.child_of(&node.element))
71 .map(|(index, _)| index)
72 }
73
74 pub fn by_id(&self, id: &K) -> Option<&ArenaNode<E>> {
75 self.mapping.get(id).into_iter()
76 .flat_map(|i| self.by_index(*i))
77 .next()
78 }
79
80 pub fn by_id_mut(&mut self, id: &K) -> Option<&mut ArenaNode<E>> {
81 if let Some(index) = self.mapping.get(id) {
82 return self.by_index_mut(*index);
83 }
84 None
85 }
86
87 pub fn by_index(&self, index: usize) -> Option<&ArenaNode<E>> {
88 self.nodes.get(index)
89 }
90
91 pub fn by_index_mut(&mut self, index: usize) -> Option<&mut ArenaNode<E>> {
92 self.nodes.get_mut(index)
93 }
94
95 pub fn fill(&mut self, mut elements: Vec<E>) {
96 while elements.len() > 0 {
98 self.insert(elements.remove(0));
99 }
100 let mut hanging_indexes = self.nodes.iter().enumerate()
102 .filter(|&(i, n)| i > 0 && matches!(n.parent, None))
103 .map(|(i, _)| i).collect::<Vec<_>>();
104 while hanging_indexes.len() > 0 {
106 let hanging_index = hanging_indexes.remove(0);
107 let hanging_node = self.by_index(hanging_index).unwrap();
108 if matches!(hanging_node.parent, Some(_)) {
109 } else if let Some(parent_index) = self.find_parent(&hanging_node.element) {
110 self.by_index_mut(hanging_index).iter_mut().for_each(|n| n.parent = Some(parent_index));
111 } else {
112 let parent_element = hanging_node.element.new_parent();
113 let (_, parent_index) = self.insert(parent_element);
114 hanging_indexes.push(parent_index);
116 self.by_index_mut(hanging_index).iter_mut().for_each(|n| n.parent = Some(parent_index));
117 }
118 }
119 }
120}
121
122impl <E, K> Deref for ArenaTree<E, K> {
123 type Target = Vec<ArenaNode<E>>;
124
125 fn deref(&self) -> &Self::Target {
126 &self.nodes
127 }
128}
129
130impl <E, K> DerefMut for ArenaTree<E, K> {
131 fn deref_mut(&mut self) -> &mut Self::Target {
132 &mut self.nodes
133 }
134}