1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use super::*;
impl Table {
pub fn update<T: Borrow<str>>(
&mut self,
x: usize,
y: usize,
raw_string: T,
) -> Result<(), TableError> {
let raw_table = &mut self.raw_table;
let tree_table = &mut self.tree_table;
let ref_src_table = &mut self.ref_src_table;
let dependents_table = &mut self.dependents_table;
let calculated_table = &mut self.calculated_table;
if raw_table.len() <= y || raw_table[y].len() <= x {
return Err(TableError::OutOfRange { x, y });
}
raw_table[y][x] = raw_string.borrow().to_string();
for (x_of_src, y_of_src) in dependents_table[y][x].keys() {
let x_of_src = *x_of_src;
let y_of_src = *y_of_src;
if y_of_src < ref_src_table.len() && x_of_src < ref_src_table[y].len() {
ref_src_table[y_of_src][x_of_src].retain(|&v| v != (x, y));
}
}
let (tree, refs) = Self::build_tree(&raw_string);
let mut dependents = HashMap::new();
for dependent in refs {
*(dependents.entry(dependent).or_insert(0)) += 1;
}
tree_table[y][x] = tree;
dependents_table[y][x] = dependents;
for &(x_of_src, y_of_src) in dependents_table[y][x].keys() {
if y_of_src < ref_src_table.len() && x_of_src < ref_src_table[y].len() {
ref_src_table[y_of_src][x_of_src].push((x, y));
}
}
Self::calc(
x,
y,
tree_table,
ref_src_table,
dependents_table,
calculated_table,
&mut vec![],
);
Ok(())
}
}