syntax_tree/
node.rs

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 uniquely identifying the node.
12    id: String,
13
14    /// Children of the node.
15    children: Option<Vec<Node<T>>>,
16
17    /// Set to be filled with syntax/format information.
18    infos: HashSet<Rc<T>>,
19
20    /// Text the node (when a leaf) is holding.
21    text: Option<String>,
22
23    /// Whether this node is the root node.
24    root: bool,
25
26    /// Change event listener reference.
27    listener: Option<Rc<change::Listener<T>>>,
28}
29
30struct AffectedNode {
31    /// Affected node index.
32    node_index: usize,
33
34    /// Start of the range.
35    start: usize,
36
37    /// End of the range.
38    end: usize,
39
40    /// Whether the affected node is completely enlosed by the range.
41    completely_enclosed: bool,
42}
43
44impl<T> Node<T>
45    where T: Eq + Hash {
46    /// Create new leaf node.
47    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    /// Create new node.
59    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    /// Create new root node.
71    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    /// Get the ID of the node.
83    pub fn id(&self) -> &String {
84        &self.id
85    }
86
87    /// Check whether this node is a
88    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    /// Add a child to this node.
96    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    /// Get text the node (or children) is/are holding.
106    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    /// Length of the underlying text.
125    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    /// Get iterator over all infos this node has.
138    pub fn infos(&self) -> Iter<Rc<T>> {
139        self.infos.iter()
140    }
141
142    /// Add info to the node.
143    pub fn add_info(&mut self, info: Rc<T>) {
144        self.infos.insert(info);
145    }
146
147    /// Clear all infos from this node without recursion in children.
148    pub fn clear_infos(&mut self) {
149        self.infos.clear();
150    }
151
152    /// Remove info from the node.
153    /// Specify recurse whether the info should be removed from children as well.
154    /// Since a node can end up useless without info, it might have to be replaced
155    /// by its children which are then returned by this method.
156    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                    // Intersects fully -> Do nothing
167                } else if start_idx == 0 {
168                    // Intersects only in the beginning of the child node -> Split and remove info from left node.
169                    set_later.push((vec!((end_idx, length)), vec!(info)));
170                } else if end_idx == length {
171                    // Intersects only in the end of the child node -> Split and remove info from the right node.
172                    set_later.push((vec!((0, start_idx)), vec!(info)));
173                } else {
174                    // Intersects in the middle of the child node -> Split and remove info from the middle node.
175                    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                            // Intersects fully -> Just remove info from child node
206                        } else if start == 0 {
207                            // Intersects only in the beginning of the child node -> Split and remove info from left node.
208                            set_later.push((vec!((offset + end, offset + length)), old_infos));
209                        } else if end == length {
210                            // Intersects only in the end of the child node -> Split and remove info from the right node.
211                            set_later.push((vec!((offset, start + offset)), old_infos));
212                        } else {
213                            // Intersects in the middle of the child node -> Split and remove info from the middle node.
214                            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            // Find and process single-item replace later nodes which consist of one
234            // unformatted leaf. If they are adjacent, they can be merged.
235            // Handle the others as usual by replacing the old child with its children.
236            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                // Replace the old node by its children.
246                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                // Collect and merge adjacent unformatted leafs.
263                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                // Merge adjacent unformatted leafs.
295                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            // Insert remaining
311            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            // Check if we have only one leaf child without info left
326            if self.child_count() == 1 && self.children.as_ref().unwrap().first().unwrap().is_leaf() {
327                // Turn this node into a leaf
328                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                // This node has no use -> replace with it's children
369                Some(self.children.take().unwrap())
370            }
371        } else {
372            None
373        }
374    }
375
376    /// Check if the node has the passed info.
377    pub fn has_info(&self, info: &T) -> bool {
378        self.infos.contains(info)
379    }
380
381    /// Set syntax/format info for the passed range.
382    /// The range is the passed start index (inclusive) to the passed end index (exclusive).
383    /// Returns a list of nodes to replace the current one in case that is needed (optional).
384    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    /// Unset the passed syntax/format info for the passed range.
400    /// The range is the passed start index (inclusive) to the passed end index (exclusive).
401    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    /// Set for a node with children.
410    fn set_on_node(&mut self, start_idx: usize, end_idx: usize, info: Rc<T>) {
411        // Check if affects only this node
412        let length = self.length();
413        if start_idx == 0 && end_idx == length {
414            // Remove info in children -> now unnecessary
415            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    /// Set on nodes children.
427    fn set_on_node_children(&mut self, mut start_idx: usize, end_idx: usize, info: Rc<T>) {
428        // Find out which child-node(s) is/are affected
429        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        // Collect all completely enclosed child nodes.
457        let completely_enclosed: Vec<&AffectedNode> = affected_children.iter().filter(|a| a.completely_enclosed).collect();
458        if completely_enclosed.len() >= 2 {
459            // Build new parent node for these nodes
460            let mut parent = Node::new();
461            parent.give_listener(&self.listener);
462            parent.add_info(Rc::clone(&info));
463
464            // Remove all completely enclosed children from old parent and assign to the new one
465            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            // Insert new parent as child of the old parent
475            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            // Reduce to the rest of the affected children, which have not been handled yet.
480            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        // Set the object to the affected children.
492        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)); // Replace the child node with the passed nodes later.
499            }
500        }
501
502        // Replace the child nodes which need to
503        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    /// Regroup neighboring nodes with similar syntax/format info.
519    fn regroup_neighbors(&mut self) {
520        if let Some((info, indices)) = self.find_max_similar_neighbors() {
521            // Create new parent node for the similar nodes
522            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                // Merge all children
546                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            // Check if we have only one child left with the same syntax/format info as this node
564            if self.child_count() == 1 {
565                // Merge node with child
566                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    /// Find the maximum similar neighbors in the nodes children.
585    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    /// Set for a leaf node.
614    /// Returns a list of nodes to replace this leaf in the parent children list when
615    /// there is something to replace.
616    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            // Affects exactly this one leaf node
626            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            // Split this leaf in two leafs
632            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            // Split this leaf in two leafs
648            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            // Turn this leaf in three leafs
664            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    /// Insert a char in the underlying text.
686    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    /// Insert a string in the underlying text.
712    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    /// Push a char to the underlying text.
738    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    /// Push a string to the underlying text.
748    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    /// Get the count of children under this node.
758    pub fn child_count(&self) -> usize {
759        match self.children.as_ref() {
760            Some(v) => v.len(),
761            None => 0,
762        }
763    }
764
765    /// Remove a count of characters from the underlying text starting at idx.
766    /// Removing a character might lead to having an empty leaf left.
767    /// Method will return boolean tuple with two elements (bool, bool).
768    /// The first boolean will determine whether the node is unnecessary now,
769    /// the second boolean determined whether parent may need to regroup its children.
770    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            // Remove from affected children
782            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                    // Affects child
791                    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; // Next child is not affected
803                    }
804
805                    idx += remove_count;
806                    count -= remove_count;
807                }
808
809                offset += length;
810            }
811
812            // Remove now unnecessary children
813            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            // Check if having only one child left
821            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    /// Get a slice of all children under this node.
845    pub fn children(&self) -> &[Node<T>] {
846        &self.children.as_ref().unwrap()[..]
847    }
848
849    /// Give node change listener.
850    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    /// Take the change listener from this node (if any).
857    pub fn take_listener(&mut self) -> Option<Rc<change::Listener<T>>> {
858        self.listener.take()
859    }
860
861    /// Get a depth first pre order iterator.
862    pub fn pre_order_iter(&self) -> iterator::PreOrder<T> {
863        iterator::PreOrder::new(self)
864    }
865
866    /// Get a leaf iterator.
867    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    /// Emit a change event.
872    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}