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