1use std::fmt;
2use crate::{iterator, change};
3use std::rc::Rc;
4use std::collections::HashSet;
5use std::collections::hash_set::Iter;
6use std::hash::Hash;
7use std::fmt::Debug;
8use uuid::Uuid;
9
10pub struct Node<T> {
11 id: String,
13
14 children: Option<Vec<Node<T>>>,
16
17 infos: HashSet<Rc<T>>,
19
20 text: Option<String>,
22
23 root: bool,
25
26 listener: Option<Rc<change::Listener<T>>>,
28}
29
30struct AffectedNode {
31 node_index: usize,
33
34 start: usize,
36
37 end: usize,
39
40 completely_enclosed: bool,
42}
43
44impl<T> Node<T>
45 where T: Eq + Hash {
46 pub fn new_leaf(text: String) -> Node<T> {
48 Node {
49 id: Uuid::new_v4().to_string(),
50 children: None,
51 infos: HashSet::new(),
52 text: Some(text),
53 root: false,
54 listener: None,
55 }
56 }
57
58 pub fn new() -> Node<T> {
60 Node {
61 id: Uuid::new_v4().to_string(),
62 children: None,
63 infos: HashSet::new(),
64 text: None,
65 root: false,
66 listener: None,
67 }
68 }
69
70 pub fn new_root(string: &str) -> Node<T> {
72 Node {
73 id: Uuid::new_v4().to_string(),
74 children: None,
75 infos: HashSet::new(),
76 text: Some(String::from(string)),
77 root: true,
78 listener: None,
79 }
80 }
81
82 pub fn id(&self) -> &String {
84 &self.id
85 }
86
87 pub fn is_leaf(&self) -> bool {
89 match self.children.as_ref() {
90 Some(v) => v.is_empty(),
91 None => true
92 }
93 }
94
95 pub fn add_child(&mut self, child: Node<T>) {
97 if self.children.is_none() {
98 self.children = Some(Vec::new());
99 }
100
101 self.children.as_mut().unwrap().push(child);
102 self.emit_event(change::Event::NodeAdded { parent: &self, added_idx: self.child_count() - 1 });
103 }
104
105 pub fn text(&self) -> String {
107 if self.is_leaf() {
108 match self.text.as_ref() {
109 Some(v) => v.to_string(),
110 None => {
111 println!("WARNING: Leaf does not have text");
112 "".to_string()
113 }
114 }
115 } else {
116 let mut result = String::with_capacity(self.length());
117 for child in self.children.as_ref().unwrap() {
118 result.push_str(&child.text());
119 }
120 result
121 }
122 }
123
124 pub fn length(&self) -> usize {
126 if self.is_leaf() {
127 self.text.as_ref().unwrap().len()
128 } else {
129 let mut result = 0;
130 for child in self.children.as_ref().unwrap() {
131 result += child.length();
132 }
133 result
134 }
135 }
136
137 pub fn infos(&self) -> Iter<Rc<T>> {
139 self.infos.iter()
140 }
141
142 pub fn add_info(&mut self, info: Rc<T>) {
144 self.infos.insert(info);
145 }
146
147 pub fn clear_infos(&mut self) {
149 self.infos.clear();
150 }
151
152 pub fn remove_info(&mut self, start_idx: usize, end_idx: usize, info: Rc<T>, recurse: bool) -> Option<Vec<Node<T>>> {
157 let mut set_later = Vec::new();
158
159 if self.is_leaf() {
160 if self.infos.remove(&info) {
161 self.emit_event(change::Event::InfosChanged { node: &self });
162
163 let length = self.length();
164
165 if start_idx == 0 && end_idx == length {
166 } else if start_idx == 0 {
168 set_later.push((vec!((end_idx, length)), vec!(info)));
170 } else if end_idx == length {
171 set_later.push((vec!((0, start_idx)), vec!(info)));
173 } else {
174 set_later.push((vec!((0, start_idx), (end_idx, length)), vec!(info)));
176 }
177 }
178 } else if recurse {
179 if self.infos.remove(&info) {
180 self.emit_event(change::Event::InfosChanged { node: &self });
181 }
182
183 let mut offset = 0;
184 let mut replace_later = Vec::new();
185 for i in 0..self.child_count() {
186 let child = &mut self.children.as_mut().unwrap()[i];
187 let length = child.length();
188 let ranges_intersect = offset < end_idx && start_idx < offset + length;
189
190 if ranges_intersect {
191 let start = if start_idx > offset { start_idx - offset } else { 0 };
192 let end = if end_idx - offset > length { length } else { end_idx - offset };
193
194 let mut old_infos = Vec::new();
195 for old_info in child.infos() {
196 old_infos.push(Rc::clone(old_info));
197 }
198
199 if let Some(v) = child.remove_info(start, end, Rc::clone(&info), recurse) {
200 replace_later.push((i, v));
201 }
202
203 if old_infos.len() > 0 {
204 if start == 0 && end == length {
205 } else if start == 0 {
207 set_later.push((vec!((offset + end, offset + length)), old_infos));
209 } else if end == length {
210 set_later.push((vec!((offset, start + offset)), old_infos));
212 } else {
213 set_later.push((vec!((offset, start + offset), (offset + end, offset + length)), old_infos));
215 }
216 }
217 } else if child.is_leaf() {
218 let mut new_leaf = Node::new_leaf(child.text.take().unwrap());
219 new_leaf.give_listener(&self.listener);
220
221 for old_info in child.infos() {
222 new_leaf.add_info(Rc::clone(old_info));
223 }
224
225 replace_later.push((i, vec!(new_leaf)));
226 } else {
227 replace_later.push((i, child.children.take().unwrap()));
228 }
229
230 offset += length;
231 }
232
233 let mut replace_later_single_unformatted_leafs = Vec::new();
237 let mut to_insert = Vec::new();
238 let mut removed = 0;
239 let mut additional_children = 0;
240 for (idx, nodes) in replace_later.into_iter() {
241 self.children.as_mut().unwrap().remove(idx - removed);
242 self.emit_event(change::Event::NodeRemoved { parent: &self, removed_idx: idx - removed });
243 removed += 1;
244
245 let add_children = nodes.len() - 1;
247
248 let mut i = 0;
249 for node in nodes {
250 if node.is_leaf() && node.infos.len() == 0 {
251 replace_later_single_unformatted_leafs.push((idx + i + additional_children, node));
252 } else {
253 to_insert.push((idx + i + additional_children, node));
254 }
255 i += 1;
256 }
257
258 additional_children += add_children;
259 }
260
261 if !replace_later_single_unformatted_leafs.is_empty() {
262 let (mut start_idx, first_node) = replace_later_single_unformatted_leafs.remove(0);
264 let mut last_idx = start_idx;
265 let mut collector = vec!((last_idx, first_node));
266
267 let mut reduced_count = 0;
268
269 let mut to_merge = Vec::new();
270 for (idx, node) in replace_later_single_unformatted_leafs {
271 if idx == last_idx + 1 {
272 collector.push((idx, node));
273 } else {
274 if collector.len() > 1 {
275 reduced_count += collector.len() - 1;
276 to_merge.push((start_idx, collector));
277 } else {
278 let (idx, nodes) = collector.remove(0);
279 to_insert.push((idx - reduced_count, nodes));
280 }
281 start_idx = idx;
282 collector = vec!((idx, node));
283 }
284
285 last_idx = idx;
286 }
287 if collector.len() >= 2 {
288 to_merge.push((start_idx, collector));
289 } else {
290 let (idx, nodes) = collector.remove(0);
291 to_insert.push((idx - reduced_count, nodes));
292 }
293
294 for (idx, nodes) in to_merge {
296 let reduces_by = nodes.len() - 1;
297 let mut string = String::new();
298 for (_, n) in nodes {
299 string.push_str(n.text.as_ref().unwrap());
300 }
301
302 let mut new_leaf = Node::new_leaf(string);
303 new_leaf.give_listener(&self.listener);
304
305 to_insert.push((idx - reduced_count, new_leaf));
306 reduced_count += reduces_by;
307 }
308 }
309
310 to_insert.sort_by_key(|(idx, _)| *idx);
312 let mut child_count = self.child_count();
313 for (idx, node) in to_insert {
314 if idx >= child_count {
315 &mut self.children.as_mut().unwrap().push(node);
316 self.emit_event(change::Event::NodeAdded { parent: &self, added_idx: child_count });
317 } else {
318 &mut self.children.as_mut().unwrap().insert(idx, node);
319 self.emit_event(change::Event::NodeAdded { parent: &self, added_idx: idx });
320 }
321
322 child_count += 1;
323 }
324
325 if self.child_count() == 1 && self.children.as_ref().unwrap().first().unwrap().is_leaf() {
327 let mut n = self.children.as_mut().unwrap().remove(0);
329 self.children = None;
330 self.text = Some(n.text.take().unwrap());
331 self.emit_event(change::Event::NodeRemoved { parent: &self, removed_idx: 0 });
332
333 let mut infos_added = false;
334 for info in n.infos.into_iter() {
335 self.add_info(info);
336 infos_added = true;
337 }
338
339 if infos_added {
340 self.emit_event(change::Event::InfosChanged { node: &self });
341 }
342 }
343
344 if self.child_count() > 1 {
345 self.regroup_neighbors();
346 }
347 }
348
349 for (ranges, old_infos) in set_later {
350 for (a, b) in ranges {
351 for old_info in &old_infos {
352 if let Some(v) = self.set(a, b, Rc::clone(old_info)) {
353 for n in v {
354 self.add_child(n);
355 }
356 }
357 }
358 }
359 }
360
361 if self.infos.len() == 0 && !self.root {
362 if self.is_leaf() {
363 let mut new_leaf = Node::new_leaf(self.text.take().unwrap());
364 new_leaf.give_listener(&self.listener);
365
366 Some(vec!(new_leaf))
367 } else {
368 Some(self.children.take().unwrap())
370 }
371 } else {
372 None
373 }
374 }
375
376 pub fn has_info(&self, info: &T) -> bool {
378 self.infos.contains(info)
379 }
380
381 pub fn set(&mut self, start_idx: usize, end_idx: usize, info: Rc<T>) -> Option<Vec<Node<T>>> {
385 assert!(start_idx < end_idx);
386
387 if self.has_info(&info) {
388 return None;
389 }
390
391 if self.is_leaf() {
392 self.set_on_leaf(start_idx, end_idx, info)
393 } else {
394 self.set_on_node(start_idx, end_idx, info);
395 None
396 }
397 }
398
399 pub fn unset(&mut self, start_idx: usize, end_idx: usize, info: Rc<T>) {
402 assert!(start_idx < end_idx);
403
404 if let Some(v) = self.remove_info(start_idx, end_idx, info, true) {
405 self.children = Some(v);
406 }
407 }
408
409 fn set_on_node(&mut self, start_idx: usize, end_idx: usize, info: Rc<T>) {
411 let length = self.length();
413 if start_idx == 0 && end_idx == length {
414 if let Some(v) = self.remove_info(0, length, Rc::clone(&info), true) {
416 self.children = Some(v);
417 }
418
419 self.add_info(info);
420 self.emit_event(change::Event::InfosChanged { node: &self });
421 } else {
422 self.set_on_node_children(start_idx, end_idx, Rc::clone(&info));
423 }
424 }
425
426 fn set_on_node_children(&mut self, mut start_idx: usize, end_idx: usize, info: Rc<T>) {
428 let mut offset = 0;
430 let mut affected_children = Vec::new();
431 for i in 0..self.child_count() {
432 let child = &self.children.as_mut().unwrap()[i];
433 let length = child.length();
434
435 if start_idx >= offset && start_idx < offset + length {
436 let end = if end_idx <= offset + length { end_idx - offset } else { length };
437
438 let completely_enclosed = start_idx == offset && end == length;
439 affected_children.push(AffectedNode {
440 node_index: i,
441 start: start_idx - offset,
442 end,
443 completely_enclosed,
444 });
445
446 if end_idx <= offset + length {
447 break;
448 }
449
450 start_idx = offset + length;
451 }
452
453 offset += length;
454 }
455
456 let completely_enclosed: Vec<&AffectedNode> = affected_children.iter().filter(|a| a.completely_enclosed).collect();
458 if completely_enclosed.len() >= 2 {
459 let mut parent = Node::new();
461 parent.give_listener(&self.listener);
462 parent.add_info(Rc::clone(&info));
463
464 let mut removed_count = 0;
466 for a in &completely_enclosed {
467 let removed_child = self.children.as_mut().unwrap().remove(a.node_index - removed_count);
468 self.emit_event(change::Event::NodeRemoved { parent: &self, removed_idx: a.node_index - removed_count });
469
470 parent.add_child(removed_child);
471 removed_count += 1;
472 }
473
474 let insert_idx = completely_enclosed.first().as_ref().unwrap().node_index;
476 self.children.as_mut().unwrap().insert(insert_idx, parent);
477 self.emit_event(change::Event::NodeAdded { parent: &self, added_idx: insert_idx });
478
479 affected_children = affected_children.into_iter()
481 .filter(|a| !a.completely_enclosed)
482 .map(|mut a| {
483 if a.node_index > insert_idx {
484 a.node_index -= removed_count;
485 }
486
487 a
488 }).collect();
489 }
490
491 let mut replace_later = Vec::new();
493 for i in 0..affected_children.len() {
494 let affected = &affected_children[i];
495
496 let child = &mut self.children.as_mut().unwrap()[affected.node_index];
497 if let Some(replace_with) = child.set(affected.start, affected.end, Rc::clone(&info)) {
498 replace_later.push((affected.node_index, replace_with)); }
500 }
501
502 let mut added = 0;
504 for (idx, replace_with) in replace_later {
505 self.children.as_mut().unwrap().remove(idx);
506 self.emit_event(change::Event::NodeRemoved { parent: &self, removed_idx: idx });
507
508 for node in replace_with {
509 self.children.as_mut().unwrap().insert(idx + added, node);
510 self.emit_event(change::Event::NodeAdded { parent: &self, added_idx: idx + added });
511 added += 1;
512 }
513 }
514
515 self.regroup_neighbors();
516 }
517
518 fn regroup_neighbors(&mut self) {
520 if let Some((info, indices)) = self.find_max_similar_neighbors() {
521 let mut parent = Node::new();
523 parent.give_listener(&self.listener);
524
525 let insert_idx = indices[0];
526
527 let mut removed = 0;
528 let mut to_add = Vec::new();
529 for idx in indices {
530 let mut child = self.children.as_mut().unwrap().remove(idx - removed);
531 self.emit_event(change::Event::NodeRemoved { parent: &self, removed_idx: idx - removed });
532
533 match child.remove_info(0, child.length(), Rc::clone(&info), true) {
534 Some(v) => {
535 for n in v {
536 to_add.push(n);
537 }
538 }
539 None => to_add.push(child),
540 }
541 removed += 1;
542 }
543
544 if to_add.iter().all(|n| n.infos.len() == 0) {
545 let mut string = String::new();
547 for mut n in to_add {
548 string.push_str(&n.text.take().unwrap());
549 }
550 parent.text = Some(string);
551 } else {
552 for n in to_add {
553 parent.add_child(n);
554 }
555 parent.regroup_neighbors();
556 }
557
558 parent.add_info(info);
559
560 self.children.as_mut().unwrap().insert(insert_idx, parent);
561 self.emit_event(change::Event::NodeAdded { parent: &self, added_idx: insert_idx });
562
563 if self.child_count() == 1 {
565 let mut child = self.children.as_mut().unwrap().remove(0);
567 self.emit_event(change::Event::NodeRemoved { parent: &self, removed_idx: 0 });
568
569 self.children = Some(child.children.take().unwrap());
570 for i in 0..self.child_count() {
571 self.emit_event(change::Event::NodeAdded { parent: &self, added_idx: i });
572 }
573
574 if child.infos.len() > 0 {
575 for i in child.infos {
576 self.add_info(i);
577 }
578 self.emit_event(change::Event::InfosChanged { node: &self });
579 }
580 }
581 }
582 }
583
584 fn find_max_similar_neighbors<'a>(&self) -> Option<(Rc<T>, Vec<usize>)> {
586 let children = self.children.as_ref().unwrap();
587 let length = children.len();
588
589 let mut max_result: Option<(Rc<T>, Vec<usize>)> = None;
590 for i in 0..length {
591 let child = &children[i];
592
593 for info in &child.infos {
594 let mut similar = vec!(i);
595 for o in i + 1..length {
596 let other_child = &children[o];
597 if other_child.has_info(info) {
598 similar.push(o);
599 } else {
600 break;
601 }
602 }
603
604 if similar.len() > 1 && (max_result.is_none() || max_result.as_ref().unwrap().1.len() < similar.len()) {
605 max_result = Some((Rc::clone(info), similar));
606 }
607 }
608 }
609
610 max_result
611 }
612
613 fn set_on_leaf(&mut self, start_idx: usize, end_idx: usize, info: Rc<T>) -> Option<Vec<Node<T>>> {
617 let text = self.text.take().unwrap();
618 let length = text.len();
619 let has_infos = self.infos.len() > 0;
620
621 assert!(start_idx <= length);
622 assert!(end_idx <= length);
623
624 if start_idx == 0 && end_idx == length {
625 self.add_info(info);
627 self.text = Some(text);
628 self.emit_event(change::Event::InfosChanged { node: &self });
629 None
630 } else if start_idx == 0 {
631 let mut left_node = Node::new_leaf(String::from(&text[0..end_idx]));
633 left_node.give_listener(&self.listener);
634 left_node.add_info(info);
635
636 let mut right_node = Node::new_leaf(String::from(&text[end_idx..length]));
637 right_node.give_listener(&self.listener);
638
639 if has_infos || self.root {
640 self.add_child(left_node);
641 self.add_child(right_node);
642 None
643 } else {
644 Some(vec!(left_node, right_node))
645 }
646 } else if end_idx == length {
647 let mut left_node = Node::new_leaf(String::from(&text[0..start_idx]));
649 left_node.give_listener(&self.listener);
650
651 let mut right_node = Node::new_leaf(String::from(&text[start_idx..length]));
652 right_node.give_listener(&self.listener);
653 right_node.add_info(info);
654
655 if has_infos || self.root {
656 self.add_child(left_node);
657 self.add_child(right_node);
658 None
659 } else {
660 Some(vec!(left_node, right_node))
661 }
662 } else {
663 let mut left_node = Node::new_leaf(String::from(&text[0..start_idx]));
665 left_node.give_listener(&self.listener);
666
667 let mut middle_node = Node::new_leaf(String::from(&text[start_idx..end_idx]));
668 middle_node.give_listener(&self.listener);
669 middle_node.add_info(info);
670
671 let mut right_node = Node::new_leaf(String::from(&text[end_idx..length]));
672 right_node.give_listener(&self.listener);
673
674 if has_infos || self.root {
675 self.add_child(left_node);
676 self.add_child(middle_node);
677 self.add_child(right_node);
678 None
679 } else {
680 Some(vec!(left_node, middle_node, right_node))
681 }
682 }
683 }
684
685 pub fn insert(&mut self, idx: usize, ch: char) {
687 if self.is_leaf() {
688 let length = self.length();
689
690 if idx >= length {
691 panic!("Cannot insert at position {} when underlying text has length {}", idx, length);
692 }
693
694 self.text.as_mut().unwrap().insert(idx, ch);
695 self.emit_event(change::Event::TextChanged { node: &self });
696 } else {
697 let mut offset = 0;
698 for child in self.children.as_mut().unwrap() {
699 let length = child.length();
700
701 if idx <= offset + length {
702 child.insert(idx - offset, ch);
703 break;
704 }
705
706 offset += child.length();
707 }
708 }
709 }
710
711 pub fn insert_str(&mut self, idx: usize, string: &str) {
713 if self.is_leaf() {
714 let length = self.length();
715
716 if idx > length {
717 panic!("Cannot insert at position {} when underlying text has length {}", idx, length);
718 }
719
720 self.text.as_mut().unwrap().insert_str(idx, string);
721 self.emit_event(change::Event::TextChanged { node: &self });
722 } else {
723 let mut offset = 0;
724 for child in self.children.as_mut().unwrap() {
725 let length = child.length();
726
727 if idx <= offset + length {
728 child.insert_str(idx - offset, string);
729 break;
730 }
731
732 offset += child.length();
733 }
734 }
735 }
736
737 pub fn push(&mut self, ch: char) {
739 if self.is_leaf() {
740 self.text.as_mut().unwrap().push(ch);
741 self.emit_event(change::Event::TextChanged { node: &self });
742 } else {
743 self.children.as_mut().unwrap().last_mut().unwrap().push(ch);
744 }
745 }
746
747 pub fn push_str(&mut self, string: &str) {
749 if self.is_leaf() {
750 self.text.as_mut().unwrap().push_str(string);
751 self.emit_event(change::Event::TextChanged { node: &self });
752 } else {
753 self.children.as_mut().unwrap().last_mut().unwrap().push_str(string);
754 }
755 }
756
757 pub fn child_count(&self) -> usize {
759 match self.children.as_ref() {
760 Some(v) => v.len(),
761 None => 0,
762 }
763 }
764
765 pub fn remove(&mut self, mut idx: usize, mut count: usize) -> (bool, bool) {
771 let length = self.length();
772
773 if self.is_leaf() {
774 assert!(idx + count <= length);
775
776 self.text.as_mut().unwrap().replace_range(idx..idx + count, "");
777 if self.length() > 0 {
778 self.emit_event(change::Event::TextChanged { node: &self });
779 }
780 } else {
781 let mut offset = 0;
783 let mut remove_later = Vec::new();
784 let mut may_need_regroup = false;
785 for i in 0..self.child_count() {
786 let child = &mut self.children.as_mut().unwrap()[i];
787 let length = child.length();
788
789 if idx >= offset && idx < offset + length {
790 let max_end = offset + length;
792 let end = if idx + count < max_end { idx + count } else { max_end };
793
794 let remove_count = end - idx;
795 let (unnecessary, needs_regroup) = child.remove(idx - offset, remove_count);
796 if unnecessary {
797 remove_later.push(i);
798 }
799 may_need_regroup = may_need_regroup || needs_regroup;
800
801 if idx + count <= max_end {
802 break; }
804
805 idx += remove_count;
806 count -= remove_count;
807 }
808
809 offset += length;
810 }
811
812 let mut removed = 0;
814 for i in remove_later {
815 self.children.as_mut().unwrap().remove(i - removed);
816 self.emit_event(change::Event::NodeRemoved { parent: &self, removed_idx: i - removed });
817 removed += 1;
818 }
819
820 if self.child_count() == 1 {
822 let mut child = self.children.as_mut().unwrap().remove(0);
823 self.children = None;
824 self.text = Some(child.text.take().unwrap());
825 self.emit_event(change::Event::NodeRemoved { parent: &self, removed_idx: 0 });
826
827 for info in child.infos {
828 self.add_info(info);
829 }
830 self.emit_event(change::Event::InfosChanged { node: &self });
831
832 return (self.length() == 0, true);
833 } else if self.children.as_ref().unwrap().is_empty() {
834 self.children = None;
835 self.text = Some(String::from(""));
836 } else if may_need_regroup {
837 self.regroup_neighbors();
838 }
839 }
840
841 (self.length() == 0, false)
842 }
843
844 pub fn children(&self) -> &[Node<T>] {
846 &self.children.as_ref().unwrap()[..]
847 }
848
849 pub fn give_listener(&mut self, l: &Option<Rc<change::Listener<T>>>) {
851 if let Some(v) = l {
852 self.listener = Some(Rc::clone(v));
853 }
854 }
855
856 pub fn take_listener(&mut self) -> Option<Rc<change::Listener<T>>> {
858 self.listener.take()
859 }
860
861 pub fn pre_order_iter(&self) -> iterator::PreOrder<T> {
863 iterator::PreOrder::new(self)
864 }
865
866 pub fn leaf_iter(&self) -> impl Iterator<Item=iterator::Item<T>> {
868 self.pre_order_iter().filter(|item| item.node.is_leaf())
869 }
870
871 fn emit_event(&self, event: change::Event<T>) {
873 if let Some(l) = &self.listener {
874 l(event);
875 }
876 }
877}
878
879impl<T> fmt::Debug for Node<T>
880 where T: Ord + Hash + Debug {
881 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
882 for iterator::Item { node, level } in self.pre_order_iter() {
883 let mut sorted_infos: Vec<&Rc<T>> = node.infos().collect();
884 sorted_infos.sort();
885
886 writeln!(
887 f,
888 "{spacing}|-- '{text}'{format}",
889 spacing = " ".repeat(level * 4),
890 text = node.text(),
891 format = format!(" {:?}", sorted_infos))?;
892 }
893
894 Ok(())
895 }
896}