1use std::cmp::Ordering;
2use std::fmt::{Arguments, Debug, Write};
3pub mod range;
4pub use range::TextRange;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
7pub enum Color {
8 Red = 0,
9 Black,
10}
11
12impl Color {
13 pub fn flip(&self) -> Color {
14 match self {
15 Color::Red => Color::Black,
16 Color::Black => Color::Red,
17 }
18 }
19}
20
21#[derive(Clone)]
22pub struct Node<T: Clone> {
23 pub key: TextRange,
24 pub val: T,
25 left: MaybeNode<T>,
26 right: MaybeNode<T>,
27 color: Color,
28 is_right_child: bool,
29 n: usize,
30}
31pub type BoxedNode<T> = Box<Node<T>>;
32pub type MaybeNode<T> = Option<BoxedNode<T>>;
33
34impl<T: Clone> Node<T> {
35 #[inline]
36 pub fn red(node: &MaybeNode<T>) -> bool {
37 node.as_ref().is_some_and(|n| n.color == Color::Red)
38 }
39
40 #[inline]
41 pub fn new(key: TextRange, val: T, is_right_child: bool) -> Node<T> {
42 Self { key, val, left: None, right: None, color: Color::Red, n: 1, is_right_child }
43 }
44
45 #[inline]
46 pub fn new_boxed(key: TextRange, val: T, is_right_child: bool) -> BoxedNode<T> {
47 Box::new(Self::new(key, val, is_right_child))
48 }
49
50 pub fn rotate_left(node: &mut BoxedNode<T>) -> Option<&mut BoxedNode<T>> {
58 let mut x = node.right.take()?;
59 let mut c = x.left.take();
60 if let Some(ref mut c) = c {
61 c.is_right_child = true;
62 }
63 node.right = c;
64 x.color = node.color;
65 x.is_right_child = node.is_right_child;
66 node.is_right_child = false;
67 x.n = node.n;
68 node.color = Color::Red;
69 node.n = node.n();
70 std::mem::swap(node, &mut x);
72 node.left.replace(x);
73 Some(node)
74 }
75
76 pub fn rotate_right(node: &mut BoxedNode<T>) -> Option<&mut BoxedNode<T>> {
84 let mut x = node.left.take()?;
85 let mut c = x.right.take();
86 if let Some(ref mut c) = c {
87 c.is_right_child = false;
88 }
89 node.left = c;
90 x.color = node.color;
91 x.is_right_child = node.is_right_child;
92 node.is_right_child = true;
93 node.color = Color::Red;
94 x.n = node.n;
95 node.n = node.n();
96
97 std::mem::swap(node, &mut x);
98 node.right.replace(x);
99 Some(node)
100 }
101
102 #[inline]
104 pub fn n(&self) -> usize {
105 let l = match self.left {
106 Some(ref n) => n.n,
107 None => 0,
108 };
109 let r = match self.right {
110 Some(ref n) => n.n,
111 None => 0,
112 };
113 1 + l + r
114 }
115
116 fn min(&self) -> &Node<T> {
117 if let Some(ref l) = self.left { l.min() } else { self }
118 }
119
120 pub fn get_node(&self, key: TextRange) -> Option<&Node<T>> {
121 match key.cmp(&self.key) {
122 Ordering::Equal => Some(self),
123 Ordering::Less => self.left.as_ref().and_then(|n| n.get_node(key)),
124 Ordering::Greater => self.right.as_ref().and_then(|n| n.get_node(key)),
125 }
126 }
127
128 fn get_node_mut(&mut self, key: TextRange) -> Option<&mut Node<T>> {
129 match key.cmp(&self.key) {
130 Ordering::Equal => Some(self),
131 Ordering::Less => self.left.as_mut().and_then(|n| n.get_node_mut(key)),
132 Ordering::Greater => self.right.as_mut().and_then(|n| n.get_node_mut(key)),
133 }
134 }
135
136 fn get(&self, key: TextRange) -> Option<T> {
137 match key.cmp(&self.key) {
138 Ordering::Equal => Some(self.val.clone()),
139 Ordering::Less => self.left.as_ref().and_then(|n| n.get(key)),
140 Ordering::Greater => self.right.as_ref().and_then(|n| n.get(key)),
141 }
142 }
143
144 pub fn insert_at<'a, F: Fn(T, T) -> T>(
149 node: &'a mut MaybeNode<T>,
150 key: TextRange,
151 val: T,
152 is_right_child: bool,
153 merge_fn: &F,
154 ) -> Option<&'a mut BoxedNode<T>> {
155 if key.start == key.end {
156 return None;
157 }
158 match node {
159 Some(n) => Node::insert_at_inner(n, key, val, merge_fn),
160 None => {
161 node.replace(Node::new_boxed(key, val.clone(), is_right_child));
162 node.as_mut()
163 }
164 }
165 }
166
167 fn insert_at_inner<'a, F: Fn(T, T) -> T>(
168 node: &'a mut BoxedNode<T>,
169 mut key: TextRange,
170 val: T,
171 merge_fn: &F,
172 ) -> Option<&'a mut BoxedNode<T>> {
173 let intersect = key.intersects(node.key);
174 if intersect {
176 if key.start < node.key.start {
177 let key_left = key.split_at(node.key.start, true);
178 Node::insert_at(&mut node.left, key_left, val.clone(), false, merge_fn);
179
180 if key.end < node.key.end {
181 let key_right = node.key.split_at(key.end, false);
182 Node::insert_at(&mut node.right, key_right, node.val.clone(), true, merge_fn);
183 } else if key.end > node.key.end {
184 let key_right = key.split_at(node.key.end, false);
185 Node::insert_at(&mut node.right, key_right, val.clone(), true, merge_fn);
186 }
187 } else {
188 let key_left = node.key.split_at(key.start, true);
189 Node::insert_at(&mut node.left, key_left, node.val.clone(), false, merge_fn);
190
191 if key.end < node.key.end {
192 let key_right = node.key.split_at(key.end, false);
193 Node::insert_at(&mut node.right, key_right, node.val.clone(), true, merge_fn);
194 } else if key.end > node.key.end {
195 let key_right = key.split_at(node.key.end, false);
196 Node::insert_at(&mut node.right, key_right, val.clone(), true, merge_fn);
197 }
198 }
199 }
200 if key.start == key.end {
201 return None;
202 }
203 let cmp = key.cmp(&node.key);
204 match cmp {
205 Ordering::Less => {
206 Node::insert_at(&mut node.left, key, val, false, merge_fn)?;
207 }
208 Ordering::Equal => {
209 node.val = merge_fn(val, node.val.clone());
210 }
211 Ordering::Greater => {
212 Node::insert_at(&mut node.right, key, val, true, merge_fn)?;
213 }
214 }
215
216 if Node::red(&node.right) && !Node::red(&node.left) {
218 Node::rotate_left(node)?;
219 }
220
221 let cond2 = match node.left {
223 Some(ref nl) => nl.color == Color::Red && Node::red(&nl.left),
224 None => false,
225 };
226 if cond2 {
227 Node::rotate_right(node)?;
228 }
229
230 if let (Some(l), Some(r)) = (&mut node.left, &mut node.right)
232 && l.color == Color::Red
233 && r.color == Color::Red
234 {
235 l.color = Color::Black;
236 r.color = Color::Black;
237 node.color = Color::Red;
238 }
239 node.n = node.n();
241
242 node.n = node.n();
244 Some(node)
245 }
246
247 fn flip_colors(n: &mut BoxedNode<T>) {
253 if let Some(ref mut l) = n.left {
254 l.color = l.color.flip();
255 }
256 if let Some(ref mut r) = n.right {
257 r.color = r.color.flip();
258 }
259 n.color = n.color.flip();
260 }
261
262 fn balance(node: &mut BoxedNode<T>) -> Option<()> {
264 if Node::red(&node.right) {
265 Node::rotate_left(node)?;
266 }
267 Some(())
268 }
269
270 fn move_red_left(node: &mut BoxedNode<T>) -> Option<()> {
273 Node::flip_colors(node);
274 if let Some(ref mut nr) = node.right.as_mut()
276 && Node::red(&nr.left)
277 {
278 Node::rotate_right(nr)?;
279 Node::rotate_left(node)?;
280 Node::flip_colors(node);
281 }
282 Some(())
283 }
284
285 fn move_red_right(node: &mut BoxedNode<T>) -> Option<()> {
286 Node::flip_colors(node);
287 let cond = match node.left {
289 Some(ref l) => Node::red(&l.left),
290 None => false,
291 };
292 if cond {
293 Node::rotate_right(node)?;
294 Node::flip_colors(node);
295 }
296 Some(())
297 }
298
299 fn delete_min(node: &mut MaybeNode<T>) -> MaybeNode<T> {
300 let n = node.as_mut()?;
301 match n.left {
302 Some(ref mut l) => {
303 if l.color == Color::Black && !Node::red(&l.left) {
304 Node::move_red_left(n)?;
305 }
306 let result = Node::delete_min(&mut n.left);
307 Node::balance(n)?;
308 n.n = n.n(); result
310 }
311 None => {
312 let mut removed = node.take()?;
314 *node = removed.right.take();
315 Some(removed)
316 }
317 }
318 }
319
320 fn delete_max(node: &mut MaybeNode<T>) -> MaybeNode<T> {
321 let n = node.as_mut()?;
322 if Node::red(&n.left) {
323 Node::rotate_right(n);
324 }
325 let n = node.as_mut()?;
326 match n.right {
327 Some(ref mut r) => {
328 if r.color == Color::Black && !Node::red(&r.left) {
329 Node::move_red_right(n)?;
330 }
331 let result = Node::delete_max(&mut n.right);
332 Node::balance(n)?;
333 n.n = n.n(); result
335 }
336 None => {
337 let mut removed = node.take()?;
339 *node = removed.left.take();
340 Some(removed)
341 }
342 }
343 }
344
345 fn delete(node: &mut MaybeNode<T>, key: TextRange) -> MaybeNode<T> {
346 let n = node.as_mut()?;
347 let result = if key < n.key {
348 if let Some(ref mut l) = n.left
350 && l.color == Color::Black
351 && !Node::red(&l.left)
352 {
353 Node::move_red_left(n).unwrap();
354 }
355 Node::delete(&mut n.left, key)
356 } else {
357 if Node::red(&n.left) {
358 Node::rotate_right(n).unwrap();
359 }
360 if key == n.key && n.right.is_none() {
361 let mut removed = node.take();
364 if let Some(ref mut removed_node) = removed {
365 let left_subtree = removed_node.left.take();
366 *node = left_subtree;
367 }
368 return removed;
369 }
370
371 let cond = if let Some(ref r) = n.right {
372 r.color == Color::Black && !Node::red(&r.left)
373 } else {
374 true
375 };
376
377 if cond {
378 Node::move_red_right(n).unwrap();
379 }
380
381 if key == n.key {
382 let mut result = Node::delete_min(&mut n.right);
383 let r_min = result.as_mut().unwrap();
384 r_min.left = n.left.take();
385 r_min.right = n.right.take();
386 r_min.color = n.color;
387 r_min.is_right_child = n.is_right_child;
388 r_min.n = n.n;
389 std::mem::swap(r_min, n);
390 result
391 } else {
392 Node::delete(&mut n.right, key)
393 }
394 };
395
396 Node::balance(n)?;
397 n.n = n.n(); result
399 }
400
401 pub fn find_intersects<'a>(&'a self, range: TextRange, results: &mut Vec<&'a Node<T>>) {
406 let ord = range.strict_order(&self.key);
407 match ord {
408 Some(Ordering::Less) => {
409 if let Some(ref l) = self.left {
410 l.find_intersects(range, results);
411 }
412 }
413 Some(Ordering::Greater) => {
414 if let Some(ref r) = self.right {
415 r.find_intersects(range, results);
416 }
417 }
418 _ => {
419 if let Some(ref l) = self.left {
420 l.find_intersects(range, results);
421 }
422 results.push(self);
423 if let Some(ref r) = self.right {
424 r.find_intersects(range, results);
425 }
426 }
427 }
428 }
429
430 fn find_intersect_min(&self, range: TextRange) -> Option<&Node<T>> {
431 if range.start == range.end {
432 return None;
433 }
434 let ord = range.strict_order(&self.key);
435 match ord {
436 Some(Ordering::Less) => self.left.as_ref().and_then(|l| l.find_intersect_min(range)),
437 Some(Ordering::Equal) => Some(self),
438 Some(Ordering::Greater) => {
439 self.right.as_ref().and_then(|r| r.find_intersect_min(range))
440 }
441 _ => self.left.as_ref().and_then(|l| l.find_intersect_min(range)).or(Some(self)),
442 }
443 }
444
445 fn find_intersect_max(&self, range: TextRange) -> Option<&Node<T>> {
446 if range.start == range.end {
447 return None;
448 }
449 let ord = range.strict_order(&self.key);
450 match ord {
451 Some(Ordering::Less) => self.left.as_ref().and_then(|l| l.find_intersect_max(range)),
452 Some(Ordering::Equal) => Some(self),
453 Some(Ordering::Greater) => {
454 self.right.as_ref().and_then(|l| l.find_intersect_max(range))
455 }
456 _ => self.right.as_ref().and_then(|l| l.find_intersect_max(range)).or(Some(self)),
457 }
458 }
459
460 fn apply<F>(&self, f: &mut F)
463 where
464 F: FnMut(&Node<T>),
465 {
466 if let Some(ref l) = self.left {
467 l.apply(f);
468 }
469 f(self);
470 if let Some(ref r) = self.right {
471 r.apply(f);
472 }
473 }
474
475 fn apply_mut<F>(&mut self, f: &mut F)
478 where
479 F: FnMut(&mut Node<T>),
480 {
481 if let Some(ref mut l) = self.left {
482 l.apply_mut(f);
483 }
484 f(self);
485 if let Some(ref mut r) = self.right {
486 r.apply_mut(f);
487 }
488 }
489
490 pub fn advance(
491 &mut self,
492 position: usize,
493 length: usize,
494 split_intervals: &mut Vec<(TextRange, T)>,
495 ) {
496 if position <= self.key.start {
497 if let Some(ref mut l) = self.left {
498 l.advance(position, length, split_intervals);
499 }
500 self.key.advance(length);
501 if let Some(ref mut r) = self.right {
502 r.apply_mut(&mut |n| n.key.advance(length));
503 }
504 } else {
505 if self.key.end > position {
506 let original_end = self.key.end;
510 self.key.end = position;
511
512 if position < original_end {
514 let second_part_range =
515 TextRange::new(position + length, original_end + length);
516 split_intervals.push((second_part_range, self.val.clone()));
517 }
518 }
519 if let Some(ref mut l) = self.left {
520 l.advance(position, length, split_intervals);
521 }
522 if let Some(ref mut r) = self.right {
523 r.advance(position, length, split_intervals);
524 }
525 }
526 }
527}
528
529#[derive(Default, Clone)]
530pub struct IntervalTree<T: Clone> {
541 root: MaybeNode<T>,
542}
543
544impl<T: Clone + PartialEq> IntervalTree<T> {
545 pub fn new() -> Self {
547 Self { root: None }
548 }
549
550 pub fn size(&self) -> usize {
551 self.root.as_ref().map_or(0, |n| n.n)
552 }
553
554 pub fn insert<F: Fn(T, T) -> T>(
571 &mut self,
572 key: impl Into<TextRange>,
573 val: T,
574 merge_fn: F,
575 ) -> Option<&mut Box<Node<T>>> {
576 let key = key.into();
577 if key.start == key.end {
578 return None;
579 }
580 let mut result = Node::insert_at(&mut self.root, key, val, false, &merge_fn);
581 result.as_mut().unwrap().color = Color::Black;
582 result
583 }
584
585 pub fn get(&self, key: impl Into<TextRange>) -> Option<T> {
595 match self.root {
596 Some(ref r) => r.get(key.into()),
597 None => None,
598 }
599 }
600
601 pub fn get_node_mut(&mut self, key: impl Into<TextRange>) -> Option<&mut Node<T>> {
602 match self.root {
603 Some(ref mut r) => r.get_node_mut(key.into()),
604 None => None,
605 }
606 }
607
608 pub fn delete_exact(&mut self, key: impl Into<TextRange>) -> MaybeNode<T> {
616 let key = key.into();
617 let result = match self.root {
618 Some(ref mut root) => {
619 if !Node::red(&root.left) && !Node::red(&root.right) {
620 root.color = Color::Red;
621 }
622
623 Node::delete(&mut self.root, key)
624 }
625 None => None,
626 };
627 if let Some(ref mut root) = self.root {
628 root.color = Color::Black;
629 }
630 result
631 }
632
633 pub fn delete_min(&mut self) -> MaybeNode<T> {
644 let root = self.root.as_mut()?;
645 if !Node::red(&root.left) && !Node::red(&root.right) {
646 root.color = Color::Red;
647 }
648 let result = Node::delete_min(&mut self.root);
649 if let Some(ref mut root) = self.root {
650 root.color = Color::Black;
651 }
652 result
653 }
654
655 pub fn delete_max(&mut self) -> MaybeNode<T> {
656 let root = self.root.as_mut()?;
657 if !Node::red(&root.left) && !Node::red(&root.right) {
658 root.color = Color::Red;
659 }
660 let result = Node::delete_max(&mut self.root);
661 if let Some(ref mut root) = self.root {
662 root.color = Color::Black;
663 }
664 result
665 }
666
667 pub fn delete(&mut self, range: impl Into<TextRange>) {
689 let range: TextRange = range.into();
690 for key in self.find_intersects(range).map(|n| n.key).collect::<Vec<_>>() {
691 if key.start >= range.start && key.end <= range.end {
693 self.delete_exact(key);
694 continue; }
696
697 if key.start < range.start {
700 if let Some(n) = self.get_node_mut(key) {
701 n.key.end = range.start;
702 if key.end > range.end {
703 let val = n.val.clone();
704 let f = |_, _| unreachable!(); self.insert(TextRange::new(range.end, key.end), val, f);
706 }
707 }
708 continue; }
710
711 if key.end > range.end
714 && let Some(n) = self.get_node_mut(key)
715 {
716 n.key.start = range.end;
717 }
718 }
719 }
720
721 pub fn advance(&mut self, position: usize, length: usize) {
725 let mut split_intervals = Vec::new();
727
728 if let Some(ref mut node) = self.root {
729 node.advance(position, length, &mut split_intervals);
730 }
731
732 for (range, val) in split_intervals {
734 self.insert(range, val, |new, _old| new); }
736
737 self.merge(|a, b| a == b);
739 }
740
741 pub fn find(&self, position: usize) -> Option<&Node<T>> {
744 let range = TextRange::new(position, position + 1);
745 self.find_intersects(range).next()
746 }
747
748 pub fn find_intersects(&self, range: impl Into<TextRange>) -> impl Iterator<Item = &Node<T>> {
751 let range = range.into();
752 let node = self.find_intersect_min(range);
753 let key = node.map(|n| n.key);
754
755 StackIterator::new(self, key, false).take_while(move |n| n.key.intersects(range))
756 }
757
758 pub fn find_intersect_min(&self, range: impl Into<TextRange>) -> Option<&Node<T>> {
786 self.root.as_ref().and_then(|r| r.find_intersect_min(range.into()))
787 }
788
789 pub fn find_intersect_max(&self, range: impl Into<TextRange>) -> Option<&Node<T>> {
791 self.root.as_ref().and_then(|r| r.find_intersect_max(range.into()))
792 }
793
794 pub fn min(&self) -> Option<&Node<T>> {
796 self.root.as_ref().map(|n| n.min())
797 }
798
799 pub fn clean<F: Fn(&T, &T) -> bool, G: Fn(&T) -> bool>(&mut self, eq: F, empty: G) {
829 let intervals: Vec<_> = self.find_intersects(TextRange::new(0, usize::MAX)).collect();
831
832 let mut operations: Vec<Operation<T>> = Vec::new();
833 let mut pending_merge: Option<(TextRange, Vec<TextRange>)> = None;
834 let mut prev: Option<&Node<T>> = None;
835
836 for node in intervals {
837 if node.key.empty() || empty(&node.val) {
839 operations.push(Operation::Delete(node.key));
840 continue;
841 }
842
843 if let Some(p) = prev {
844 if p.key.end == node.key.start && eq(&p.val, &node.val) {
845 match &mut pending_merge {
847 Some((_start, keys)) => keys.push(node.key),
848 None => pending_merge = Some((p.key, vec![node.key])),
849 }
850 } else if let Some((start_key, keys)) = pending_merge.take() {
851 operations.push(Operation::Merge(start_key, keys));
852 }
853 }
854 prev = Some(node);
855 }
856
857 if let Some((start_key, keys)) = pending_merge.take() {
858 operations.push(Operation::Merge(start_key, keys));
859 }
860
861 self.resolve_ops(operations, &|_, _| unreachable!());
862 }
863
864 pub fn is_canonical(&self) -> bool {
866 let intervals: Vec<_> = self.find_intersects(TextRange::new(0, usize::MAX)).collect();
867
868 for window in intervals.windows(2) {
870 let current = &window[0];
871 let next = &window[1];
872
873 if current.key.end == next.key.start && current.val == next.val {
876 return false;
877 }
878 }
879
880 true
881 }
882
883 pub fn clean_from<F: Fn(&T, &T) -> bool, G: Fn(&T) -> bool>(
884 &mut self,
885 start: TextRange,
886 eq: F,
887 empty: G,
888 ) {
889 let start_key = self.find_intersect_min(start).map(|n| n.key);
890 self.clean_from_node(start_key, eq, empty);
891 }
892
893 fn clean_from_node<F: Fn(&T, &T) -> bool, G: Fn(&T) -> bool>(
894 &mut self,
895 start_key: Option<TextRange>,
896 eq: F,
897 empty: G,
898 ) {
899 let mut operations: Vec<Operation<T>> = Vec::new();
903 let iter = StackIterator::new(self, start_key, false);
904
905 let mut prev_node: Option<&Node<T>> = None;
906 let mut current_merge: Option<(TextRange, Vec<TextRange>)> = None;
907
908 for node in iter {
909 if node.key.empty() || empty(&node.val) {
911 operations.push(Operation::Delete(node.key));
912 continue;
913 }
914
915 if let Some(prev) = prev_node {
917 if prev.key.end == node.key.start && eq(&prev.val, &node.val) {
918 match &mut current_merge {
920 Some((_start_key, keys)) => {
921 keys.push(node.key);
922 }
923 None => {
924 current_merge = Some((prev.key, vec![node.key]));
925 }
926 }
927 } else if let Some((start_key, keys)) = current_merge.take() {
928 operations.push(Operation::Merge(start_key, keys));
930 }
931 }
932
933 prev_node = Some(node);
934 }
935
936 if let Some((start_key, keys)) = current_merge {
938 operations.push(Operation::Merge(start_key, keys));
939 }
940
941 self.resolve_ops(operations, &|_, _| unreachable!());
942 }
943
944 pub fn merge<F: Fn(&T, &T) -> bool>(&mut self, eq: F) {
957 self.clean(eq, |_| false);
958 }
959
960 pub fn apply<F: FnMut(&T)>(&self, f: &mut F) {
961 if let Some(r) = self.root.as_ref() {
962 r.apply(&mut |n: &Node<T>| f(&n.val));
963 }
964 }
965
966 pub fn apply_mut<F: FnMut(&mut Node<T>)>(&mut self, f: &mut F) {
967 if let Some(r) = self.root.as_mut() {
968 r.apply_mut(&mut |n| f(n));
969 }
970 }
971
972 pub fn apply_with_split<F: Fn(T) -> Option<T>>(&mut self, f: F, range: impl Into<TextRange>) {
1002 let range = range.into();
1003 let merge = |new_val, _old_val| new_val;
1004
1005 let mut operations = Vec::new();
1007 let intersects = self.find_intersects(range);
1008
1009 for node in intersects {
1010 if let Some(overlap) = node.key.intersection(range) {
1011 if node.key.start < overlap.start {
1013 operations.push(Operation::Insert(
1014 TextRange::new(node.key.start, overlap.start),
1015 node.val.clone(),
1016 ));
1017 }
1018
1019 if node.key.end > overlap.end {
1021 operations.push(Operation::Insert(
1022 TextRange::new(overlap.end, node.key.end),
1023 node.val.clone(),
1024 ));
1025 }
1026
1027 if let Some(new_val) = f(node.val.clone()) {
1029 operations.push(Operation::Insert(overlap, new_val));
1030 } else {
1031 operations.push(Operation::Delete(overlap));
1032 }
1033 }
1034 }
1035
1036 self.resolve_ops(operations, &merge);
1038
1039 self.merge(|a, b| a == b);
1041 }
1042
1043 fn resolve_ops<F: Fn(T, T) -> T>(&mut self, operations: Vec<Operation<T>>, merge_fn: &F) {
1044 for op in operations {
1045 match op {
1046 Operation::Insert(key, val) => {
1047 self.insert(key, val, merge_fn);
1048 }
1049 Operation::Delete(key) => {
1050 self.delete(key);
1051 }
1052 Operation::Merge(start_key, keys) => {
1053 if let Some(node) = self.get_node_mut(start_key) {
1054 let last_key = *keys.last().unwrap();
1056 node.key.end = last_key.end;
1057 for key in keys {
1058 self.delete_exact(key);
1059 }
1060 }
1061 }
1062 }
1063 }
1064 }
1065}
1066
1067impl<T: Clone + Debug> Node<T> {
1070 fn print_inner(&self, f: &mut std::fmt::Formatter, level: usize) -> std::fmt::Result {
1071 write_fmt_with_level(
1072 f,
1073 level,
1074 format_args!("[key: {:?}, val: {:?}, color: {:?}]\n", self.key, self.val, self.color),
1075 )?;
1076 f.write_char('\n')?;
1077 if let Some(ref l) = self.left {
1078 write_fmt_with_level(f, level, format_args!("left: \n"))?;
1079 l.print_inner(f, level + 1)?;
1080 write_fmt_with_level(f, level, format_args!("left end for {:?}\n", self.key))?;
1081 } else {
1082 write_fmt_with_level(f, level, format_args!("no left child \n"))?;
1083 }
1084 if let Some(ref r) = self.right {
1085 write_fmt_with_level(f, level, format_args!("right: \n"))?;
1086 r.print_inner(f, level + 1)?;
1087 write_fmt_with_level(f, level, format_args!("right end for {:?}\n", self.key))?;
1088 } else {
1089 write_fmt_with_level(f, level, format_args!("no right child \n"))?;
1090 }
1091 Ok(())
1092 }
1093}
1094
1095impl<T: Clone + Debug> IntervalTree<T> {
1096 pub fn print(&self) {
1099 println!("{self:?}");
1100 }
1101}
1102
1103fn write_fmt_with_level(
1104 f: &mut std::fmt::Formatter,
1105 level: usize,
1106 fmt: Arguments<'_>,
1107) -> std::fmt::Result {
1108 for _ in 0..level {
1109 f.write_char('\t')?;
1110 }
1111 f.write_fmt(fmt)
1112}
1113
1114impl<T: Clone + Debug> Debug for Node<T> {
1115 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1116 f.write_str("Node:\n")?;
1117 self.print_inner(f, 0)
1118 }
1119}
1120
1121impl<T: Clone + Debug> Debug for IntervalTree<T> {
1122 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1123 f.write_str("Interval Tree:\n")?;
1124 if let Some(root) = self.root.as_ref() {
1125 root.print_inner(f, 0)?;
1126 }
1127 Ok(())
1128 }
1129}
1130
1131#[derive(Debug)]
1132enum Operation<T> {
1133 Delete(TextRange),
1134 Merge(TextRange, Vec<TextRange>), Insert(TextRange, T),
1136}
1137
1138pub struct StackIterator<'tree, T: Clone> {
1139 stack: Vec<&'tree Node<T>>,
1140 reverse_order: bool,
1141}
1142
1143impl<'tree, T: Clone> StackIterator<'tree, T> {
1144 pub fn new(tree: &'tree IntervalTree<T>, key: Option<TextRange>, reverse_order: bool) -> Self {
1145 let Some(key) = key else { return Self { stack: Vec::new(), reverse_order } };
1146 let mut stack = Vec::new();
1147 let mut current = tree.root.as_ref();
1148
1149 while let Some(node) = current {
1151 let strict_order = key.strict_order(&node.key);
1152 let push_to_stack = strict_order.is_none()
1153 || (strict_order == Some(Ordering::Less) && !reverse_order)
1154 || (strict_order == Some(Ordering::Greater) && reverse_order);
1155 if push_to_stack {
1156 stack.push(node.as_ref());
1157 }
1158 current = match key.cmp(&node.key) {
1159 Ordering::Less => node.left.as_ref(),
1160 Ordering::Greater => node.right.as_ref(),
1161 Ordering::Equal => None,
1162 };
1163 }
1164
1165 Self { stack, reverse_order }
1166 }
1167}
1168
1169impl<'tree, T: Clone> Iterator for StackIterator<'tree, T> {
1170 type Item = &'tree Node<T>;
1171
1172 fn next(&mut self) -> Option<Self::Item> {
1173 let node = self.stack.pop()?;
1175
1176 let next_branch = if self.reverse_order { node.left.as_ref() } else { node.right.as_ref() };
1178 if let Some(mut current) = next_branch {
1179 loop {
1181 self.stack.push(current);
1182 let next_branch =
1183 if self.reverse_order { current.right.as_ref() } else { current.left.as_ref() };
1184 current = match next_branch {
1185 Some(n) => n,
1186 None => break,
1187 };
1188 }
1189 }
1190
1191 Some(node)
1192 }
1193}
1194
1195#[cfg(test)]
1196mod tests {
1197 use std::ptr;
1198
1199 use super::*;
1200
1201 fn merge<T: Clone + Debug>(a: T, _b: T) -> T {
1202 a
1203 }
1204
1205 fn assert_canonical<T: Clone + PartialEq>(tree: &IntervalTree<T>) {
1207 assert!(
1208 tree.is_canonical(),
1209 "Tree is not in canonical form - adjacent intervals with equal values were not merged"
1210 );
1211 }
1212
1213 #[test]
1214 fn test_is_canonical() {
1215 let mut tree = IntervalTree::new();
1217 tree.insert(TextRange::new(1, 3), 1, merge);
1218 tree.insert(TextRange::new(3, 5), 1, merge);
1219 tree.merge(|a, b| a == b);
1220 assert!(tree.is_canonical());
1221
1222 let mut tree_non_canonical = IntervalTree::new();
1224 tree_non_canonical.insert(TextRange::new(1, 3), 1, merge);
1225 tree_non_canonical.insert(TextRange::new(3, 5), 1, merge);
1226 assert!(!tree_non_canonical.is_canonical());
1227
1228 let mut tree_diff_values = IntervalTree::new();
1230 tree_diff_values.insert(TextRange::new(1, 3), 1, merge);
1231 tree_diff_values.insert(TextRange::new(3, 5), 2, merge);
1232 tree.merge(|a, b| a == b);
1233 assert!(tree_diff_values.is_canonical());
1234
1235 let mut tree_non_adjacent = IntervalTree::new();
1237 tree_non_adjacent.insert(TextRange::new(1, 3), 1, merge);
1238 tree_non_adjacent.insert(TextRange::new(5, 7), 1, merge);
1239 tree.merge(|a, b| a == b);
1240 assert!(tree_non_adjacent.is_canonical());
1241
1242 let empty_tree: IntervalTree<i32> = IntervalTree::new();
1244 assert!(empty_tree.is_canonical());
1245 }
1246
1247 #[test]
1248 fn test_stack_iterator_empty_tree() {
1249 let tree: IntervalTree<i32> = IntervalTree::new();
1250 let mut iter = StackIterator::new(&tree, None, false);
1251 assert_eq!(iter.next().map(|n| n.val), None);
1252 }
1253
1254 #[test]
1255 fn test_stack_iterator_single_node() {
1256 let mut tree = IntervalTree::new();
1257 tree.insert(TextRange::new(0, 1), 1, merge);
1258 assert_canonical(&tree);
1259
1260 let min_key = tree.min().map(|n| n.key);
1261 let mut iter = StackIterator::new(&tree, min_key, false);
1262 assert_eq!(iter.next().map(|n| n.key), Some(TextRange::new(0, 1)));
1263 assert_eq!(iter.next().map(|n| n.key), None);
1264 }
1265
1266 #[test]
1267 fn test_stack_iterator_multiple_nodes() {
1268 let mut tree = IntervalTree::new();
1269 tree.insert(TextRange::new(2, 3), 2, merge);
1270 tree.insert(TextRange::new(1, 2), 1, merge);
1271 tree.insert(TextRange::new(3, 4), 3, merge);
1272
1273 let min_key = tree.min().map(|n| n.key);
1274 let mut iter = StackIterator::new(&tree, min_key, false);
1275 assert_eq!(iter.next().map(|n| n.key), Some(TextRange::new(1, 2)));
1276 assert_eq!(iter.next().map(|n| n.key), Some(TextRange::new(2, 3)));
1277 assert_eq!(iter.next().map(|n| n.key), Some(TextRange::new(3, 4)));
1278 assert_eq!(iter.next().map(|n| n.key), None);
1279 }
1280
1281 #[test]
1282 fn test_stack_iterator_complex_tree() {
1283 let mut tree = IntervalTree::new();
1284 tree.insert(TextRange::new(4, 5), 4, merge);
1291 tree.insert(TextRange::new(2, 3), 2, merge);
1292 tree.insert(TextRange::new(6, 7), 6, merge);
1293 tree.insert(TextRange::new(1, 2), 1, merge);
1294 tree.insert(TextRange::new(3, 4), 3, merge);
1295 tree.insert(TextRange::new(5, 6), 5, merge);
1296 tree.insert(TextRange::new(7, 8), 7, merge);
1297
1298 let min_key = tree.min().map(|n| n.key);
1299 let mut iter = StackIterator::new(&tree, min_key, false);
1300 assert_eq!(iter.next().map(|n| n.key), Some(TextRange::new(1, 2)));
1301 assert_eq!(iter.next().map(|n| n.key), Some(TextRange::new(2, 3)));
1302 assert_eq!(iter.next().map(|n| n.key), Some(TextRange::new(3, 4)));
1303 assert_eq!(iter.next().map(|n| n.key), Some(TextRange::new(4, 5)));
1304 assert_eq!(iter.next().map(|n| n.key), Some(TextRange::new(5, 6)));
1305 assert_eq!(iter.next().map(|n| n.key), Some(TextRange::new(6, 7)));
1306 assert_eq!(iter.next().map(|n| n.key), Some(TextRange::new(7, 8)));
1307 assert_eq!(iter.next().map(|n| n.key), None);
1308 }
1309
1310 fn build_tree<T: Clone + Debug + PartialEq>(val: T) -> IntervalTree<T> {
1311 let mut tree = IntervalTree::new();
1312 tree.insert(TextRange::new(0, 1), val.clone(), merge);
1313 tree.insert(TextRange::new(1, 2), val.clone(), merge);
1314 tree.insert(TextRange::new(2, 3), val.clone(), merge);
1315 tree.insert(TextRange::new(3, 4), val.clone(), merge);
1316 tree.insert(TextRange::new(4, 5), val.clone(), merge);
1317 tree.insert(TextRange::new(5, 6), val.clone(), merge);
1318 tree.insert(TextRange::new(6, 7), val.clone(), merge);
1319 tree.insert(TextRange::new(7, 8), val.clone(), merge);
1320 tree.insert(TextRange::new(8, 9), val.clone(), merge);
1321 tree.insert(TextRange::new(9, 10), val.clone(), merge);
1322 tree.print();
1323 tree
1324 }
1325
1326 fn build_tree_no_merge<T: Clone + Debug + PartialEq>(val: T) -> IntervalTree<T> {
1327 let mut tree = IntervalTree::new();
1328 tree.insert(TextRange::new(0, 1), val.clone(), merge);
1329 tree.insert(TextRange::new(1, 2), val.clone(), merge);
1330 tree.insert(TextRange::new(2, 3), val.clone(), merge);
1331 tree.insert(TextRange::new(3, 4), val.clone(), merge);
1332 tree.insert(TextRange::new(4, 5), val.clone(), merge);
1333 tree.insert(TextRange::new(5, 6), val.clone(), merge);
1334 tree.insert(TextRange::new(6, 7), val.clone(), merge);
1335 tree.insert(TextRange::new(7, 8), val.clone(), merge);
1336 tree.insert(TextRange::new(8, 9), val.clone(), merge);
1337 tree.insert(TextRange::new(9, 10), val.clone(), merge);
1338 tree.print();
1339 tree
1340 }
1341
1342 #[test]
1343 fn rotate_left() {
1344 let val = 1;
1345 let mut node1 = Node::new_boxed(TextRange::new(0, 3), val, false);
1346 node1.color = Color::Black;
1347 let mut node2 = Node::new_boxed(TextRange::new(3, 6), val, false);
1348 let mut node3 = Node::new_boxed(TextRange::new(6, 9), val, false);
1349 node3.color = Color::Black;
1350 let mut node4 = Node::new_boxed(TextRange::new(9, 12), val, false);
1351 node4.color = Color::Black;
1352 let mut node5 = Node::new_boxed(TextRange::new(12, 15), val, false);
1353 node5.color = Color::Black;
1354
1355 node2.left = Some(node3);
1356 node2.right = Some(node4);
1357 node2.color = Color::Red;
1358 node1.right = Some(node2);
1359 node1.left = Some(node5);
1360 Node::rotate_left(&mut node1);
1361 assert_eq!(node1.key.start, 3);
1362 let n2 = node1.left.unwrap();
1363 assert_eq!(n2.key.start, 0);
1364 let n3 = n2.right.unwrap();
1365 assert_eq!(n3.key.start, 6);
1366 let n4 = node1.right.unwrap();
1367 assert_eq!(n4.key.start, 9);
1368 let n5 = n2.left.unwrap();
1369 assert_eq!(n5.key.start, 12);
1370
1371 assert_eq!(node1.color, Color::Black);
1372 assert_eq!(n2.color, Color::Red);
1373 assert_eq!(n2.n, 3);
1374 }
1375
1376 #[test]
1377 fn insert() {
1378 let val = 1;
1379 let tree = build_tree_no_merge(val);
1380 let root = tree.root.as_ref().unwrap();
1381 assert_eq!(root.key.start, 3);
1382 let n1 = root.left.as_ref().unwrap();
1383 assert_eq!(n1.key.start, 1);
1384 let n2 = root.right.as_ref().unwrap();
1385 assert_eq!(n2.key.start, 7);
1386 let n3 = n2.right.as_ref().unwrap();
1387 assert_eq!(n3.key.start, 9);
1388 let n4 = n3.left.as_ref().unwrap();
1389 assert_eq!(n4.key.start, 8);
1390 assert!(n3.right.is_none());
1391 }
1392
1393 #[test]
1394 fn delete() {
1395 let val = 1;
1396 let mut tree = build_tree_no_merge(val);
1397 for k in [8, 4, 5, 7, 3, 6] {
1399 let i = TextRange::new(k, k + 1);
1400 let a = tree.delete_exact(i).unwrap();
1401 assert_eq!(a.key, i);
1402 }
1403 }
1404
1405 #[test]
1406 fn delete_ptr() {
1407 let val = 1;
1408 let mut tree = build_tree_no_merge(val);
1409 let a = 3;
1410 let key = TextRange::new(a, a + 1);
1411 let n: *mut Node<i32> = tree.get_node_mut(key).unwrap();
1412 let mut a = tree.delete_exact(key).unwrap();
1413 assert_eq!(n, ptr::from_mut(&mut *a));
1414 }
1415
1416 #[test]
1417 fn delete_min() {
1418 let val = 1;
1419 let mut tree = build_tree(val);
1420 let a = tree.delete_min().unwrap();
1422 assert_eq!(a.key.start, 0);
1423 }
1424
1425 #[test]
1426 fn test_find_intersects() {
1427 let mut tree = IntervalTree::new();
1428 tree.insert(TextRange::new(0, 5), 1, merge);
1429 tree.insert(TextRange::new(5, 10), 2, merge);
1430 tree.insert(TextRange::new(10, 15), 3, merge);
1431 tree.insert(TextRange::new(15, 20), 4, merge);
1432
1433 let results = tree.find_intersects(TextRange::new(5, 10)).collect::<Vec<_>>();
1435 assert_eq!(results.len(), 1);
1436 assert_eq!(results[0].key, TextRange::new(5, 10));
1437 assert_eq!(results[0].val, 2);
1438
1439 let results = tree.find_intersects(TextRange::new(3, 7)).collect::<Vec<_>>();
1441 assert_eq!(results.len(), 2);
1442 assert_eq!(results[0].key, TextRange::new(0, 5));
1443 assert_eq!(results[1].key, TextRange::new(5, 10));
1444
1445 let results = tree.find_intersects(TextRange::new(12, 18)).collect::<Vec<_>>();
1447 assert_eq!(results.len(), 2);
1448 assert_eq!(results[0].key, TextRange::new(10, 15));
1449 assert_eq!(results[1].key, TextRange::new(15, 20));
1450
1451 let results = tree.find_intersects(TextRange::new(8, 17)).collect::<Vec<_>>();
1453 assert_eq!(results.len(), 3);
1454 assert_eq!(results[0].key, TextRange::new(5, 10));
1455 assert_eq!(results[1].key, TextRange::new(10, 15));
1456 assert_eq!(results[2].key, TextRange::new(15, 20));
1457
1458 let results = tree.find_intersects(TextRange::new(6, 8)).collect::<Vec<_>>();
1460 assert_eq!(results.len(), 1);
1461 assert_eq!(results[0].key, TextRange::new(5, 10));
1462
1463 let results = tree.find_intersects(TextRange::new(25, 30)).collect::<Vec<_>>();
1465 assert!(results.is_empty());
1466
1467 let results = tree.find_intersects(TextRange::new(3, 3)).collect::<Vec<_>>();
1469 assert!(results.is_empty());
1470
1471 let results = tree.find_intersects(TextRange::new(0, 25)).collect::<Vec<_>>();
1473 assert_eq!(results.len(), 4);
1474
1475 let results = tree.find_intersects(TextRange::new(10, 11)).collect::<Vec<_>>();
1477 assert_eq!(results.len(), 1);
1478 assert_eq!(results[0].key, TextRange::new(10, 15));
1479 }
1480
1481 #[test]
1482 fn advance() {
1483 let merge = |a, b| a + b;
1484 let mut tree = IntervalTree::new();
1485 tree.insert(TextRange::new(0, 10), 1, merge);
1486 tree.advance(7, 5);
1487 assert_canonical(&tree);
1488 assert_eq!(tree.get(TextRange::new(0, 7)), Some(1));
1489 assert_eq!(tree.get(TextRange::new(7, 12)), None);
1490 assert_eq!(tree.get(TextRange::new(12, 15)), Some(1));
1491
1492 let mut tree = IntervalTree::new();
1493 tree.insert(TextRange::new(0, 7), 1, merge);
1494 tree.insert(TextRange::new(3, 5), 2, merge);
1495 tree.advance(4, 2);
1496 assert_canonical(&tree);
1497 assert_eq!(tree.get(TextRange::new(0, 3)), Some(1));
1498 assert_eq!(tree.get(TextRange::new(3, 4)), Some(3));
1499 assert_eq!(tree.get(TextRange::new(4, 6)), None);
1500 assert_eq!(tree.get(TextRange::new(6, 7)), Some(3));
1501 assert_eq!(tree.get(TextRange::new(7, 9)), Some(1));
1502 }
1503
1504 #[test]
1505 fn test_merge_adjacent_intervals_with_equal_properties() {
1506 let mut tree = IntervalTree::new();
1507 tree.insert(TextRange::new(1, 5), 1, merge);
1508 tree.insert(TextRange::new(5, 10), 1, merge);
1509 tree.merge(|a, b| *a == *b);
1510 assert_canonical(&tree);
1511 assert_eq!(tree.find_intersects(TextRange::new(1, 10)).collect::<Vec<_>>().len(), 1);
1512 }
1513
1514 #[test]
1515 fn test_not_merge_adjacent_intervals_with_different_properties() {
1516 let mut tree = IntervalTree::new();
1517 tree.insert(TextRange::new(1, 5), 1, merge);
1518 tree.insert(TextRange::new(5, 10), 2, merge);
1519 tree.merge(|a, b| *a == *b);
1520 assert_canonical(&tree);
1521 assert_eq!(tree.find_intersects(TextRange::new(1, 10)).collect::<Vec<_>>().len(), 2);
1522 }
1523
1524 #[test]
1525 fn test_not_merge_non_adjacent_intervals() {
1526 let mut tree = IntervalTree::new();
1527 tree.insert(TextRange::new(1, 5), 1, merge);
1528 tree.insert(TextRange::new(10, 15), 1, merge);
1529 tree.merge(|a, b| *a == *b);
1530 assert_canonical(&tree);
1531 assert_eq!(tree.find_intersects(TextRange::new(1, 15)).collect::<Vec<_>>().len(), 2);
1532 }
1533
1534 #[test]
1535 fn test_merge_multiple_adjacent_intervals_with_equal_properties() {
1536 let mut tree = IntervalTree::new();
1537 tree.insert(TextRange::new(5, 10), 1, merge);
1538 tree.insert(TextRange::new(1, 5), 1, merge);
1539 tree.insert(TextRange::new(10, 15), 1, merge);
1540 tree.merge(|a, b| *a == *b);
1541 assert_canonical(&tree);
1542 assert_eq!(tree.find_intersects(TextRange::new(1, 15)).collect::<Vec<_>>().len(), 1);
1543 }
1544
1545 #[test]
1546 fn test_handle_empty_tree() {
1547 let mut tree: IntervalTree<i32> = IntervalTree::new();
1548 tree.merge(|a, b| *a == *b);
1549 assert_eq!(tree.find_intersects(TextRange::new(1, 10)).collect::<Vec<_>>().len(), 0);
1550 }
1551
1552 #[test]
1553 fn test_handle_tree_with_single_node() {
1554 let mut tree = IntervalTree::new();
1555 tree.insert(TextRange::new(1, 5), 1, merge);
1556 tree.merge(|a, b| *a == *b);
1557 assert_eq!(tree.find_intersects(TextRange::new(1, 5)).collect::<Vec<_>>().len(), 1);
1558 }
1559
1560 #[test]
1561 fn test_apply_with_split() {
1562 let mut tree = IntervalTree::new();
1563 tree.insert(TextRange::new(0, 10), 1, merge);
1564
1565 tree.apply_with_split(|val| Some(val * 2), TextRange::new(5, 15));
1567 assert_canonical(&tree);
1568 let nodes = tree.find_intersects(TextRange::new(0, 15)).collect::<Vec<_>>();
1569 assert_eq!(nodes.len(), 2);
1570 assert_eq!(nodes[0].val, 1);
1571 assert_eq!(nodes[1].val, 2);
1572
1573 tree.apply_with_split(|_| None, TextRange::new(7, 8));
1575 assert_canonical(&tree);
1576 let nodes = tree.find_intersects(TextRange::new(0, 15)).collect::<Vec<_>>();
1577 assert_eq!(nodes.len(), 3);
1578 assert_eq!(nodes[1].key, TextRange::new(5, 7));
1579 assert_eq!(nodes[1].val, 2); tree.apply_with_split(|val| Some(val + 1), TextRange::new(2, 4));
1583 let node = tree.find_intersects(TextRange::new(2, 4)).collect::<Vec<_>>()[0];
1584 assert_eq!(node.val, 2);
1585 }
1586
1587 #[test]
1588 fn test_clone() {
1589 let mut tree = IntervalTree::new();
1590 tree.insert(TextRange::new(0, 5), 1, merge);
1591 tree.insert(TextRange::new(5, 10), 3, merge);
1592 tree.insert(TextRange::new(10, 15), 2, merge);
1593 let mut tree_cloned = tree.clone();
1594 let n1 = tree.get_node_mut(TextRange::new(0, 5)).unwrap();
1595 let n1c = tree_cloned.get_node_mut(TextRange::new(0, 5)).unwrap();
1596 assert!(!ptr::eq(n1, n1c));
1597 let n2 = tree.get_node_mut(TextRange::new(5, 10)).unwrap();
1598 let n2c = tree_cloned.get_node_mut(TextRange::new(5, 10)).unwrap();
1599 assert!(!ptr::eq(n2, n2c));
1600 let n3 = tree.get_node_mut(TextRange::new(10, 15)).unwrap();
1601 let n3c = tree_cloned.get_node_mut(TextRange::new(10, 15)).unwrap();
1602 assert!(!ptr::eq(n3, n3c));
1603 }
1604
1605 #[test]
1606 fn test_clean() {
1607 let mut tree = IntervalTree::new();
1608 tree.insert(TextRange::new(0, 5), 1, merge);
1609 tree.insert(TextRange::new(5, 10), 1, merge);
1610 tree.insert(TextRange::new(10, 15), 2, merge);
1611 tree.insert(TextRange::new(15, 20), 0, merge); tree.insert(TextRange::new(20, 25), 2, merge);
1613 tree.insert(TextRange::new(25, 30), 2, merge);
1614
1615 tree.clean(|a, b| a == b, |v| *v == 0);
1617
1618 let nodes = tree.find_intersects(TextRange::new(0, 30)).collect::<Vec<_>>();
1619 assert_eq!(nodes.len(), 3);
1620 assert_eq!(nodes[0].key, TextRange::new(0, 10));
1621 assert_eq!(nodes[2].key, TextRange::new(20, 30));
1622 }
1623
1624 #[test]
1625 fn test_clean_empty_tree() {
1626 let mut tree: IntervalTree<i32> = IntervalTree::new();
1627 tree.clean(|a, b| a == b, |v| *v == 0);
1628 assert!(tree.find_intersects(TextRange::new(0, 1)).next().is_none());
1629 }
1630
1631 #[test]
1632 fn test_clean_with_empty_intervals() {
1633 let mut tree = IntervalTree::new();
1634 tree.insert(TextRange::new(0, 0), 1, merge); tree.insert(TextRange::new(0, 5), 1, merge);
1636 tree.insert(TextRange::new(5, 5), 2, merge); tree.clean(|a, b| a == b, |v| *v == 0);
1639
1640 assert_eq!(tree.find_intersects(TextRange::new(0, 5)).collect::<Vec<_>>().len(), 1);
1641 }
1642
1643 #[test]
1644 fn test_find_intersect_min() {
1645 let mut tree = IntervalTree::new();
1646 tree.insert(TextRange::new(0, 5), 1, merge);
1647 tree.insert(TextRange::new(5, 10), 2, merge);
1648 tree.insert(TextRange::new(14, 18), 3, merge);
1649
1650 assert_eq!(
1652 tree.find_intersect_min(TextRange::new(5, 10)).unwrap().key,
1653 TextRange::new(5, 10)
1654 );
1655
1656 assert_eq!(
1658 tree.find_intersect_min(TextRange::new(3, 7)).unwrap().key,
1659 TextRange::new(0, 5)
1660 );
1661
1662 assert_eq!(
1663 tree.find_intersect_min(TextRange::new(6, 15)).unwrap().key,
1664 TextRange::new(5, 10)
1665 );
1666
1667 assert!(tree.find_intersect_min(TextRange::new(19, 23)).is_none());
1669
1670 let empty_tree: IntervalTree<i32> = IntervalTree::new();
1672 assert!(empty_tree.find_intersect_min(TextRange::new(0, 1)).is_none());
1673 }
1674
1675 #[test]
1676 fn test_delete_partial_interval_regression() {
1677 let mut tree = IntervalTree::new();
1681
1682 tree.insert(TextRange::new(0, 100), vec![42], |mut new, mut old| {
1684 new.append(&mut old);
1685 new
1686 });
1687
1688 tree.delete(TextRange::new(30, 80));
1691
1692 let results: Vec<_> = tree
1694 .find_intersects(TextRange::new(0, 100))
1695 .map(|n| (n.key, n.val.clone()))
1696 .collect();
1697
1698 assert_eq!(results.len(), 2);
1699 assert_eq!(results[0], (TextRange::new(0, 30), vec![42]));
1700 assert_eq!(results[1], (TextRange::new(80, 100), vec![42]));
1701
1702 assert!(tree.find_intersects(TextRange::new(40, 70)).next().is_none());
1704 }
1705
1706 #[test]
1707 fn test_delete_exact_preserves_left_subtree() {
1708 let mut tree = IntervalTree::new();
1711 tree.insert(TextRange::new(69, 70), 1, merge);
1712 tree.insert(TextRange::new(0, 1), 1, merge);
1713
1714 assert_eq!(tree.size(), 2);
1715
1716 tree.delete_exact(TextRange::new(69, 70));
1718
1719 assert_eq!(tree.size(), 1);
1720 assert_eq!(tree.get(TextRange::new(0, 1)), Some(1));
1721 }
1722
1723 #[test]
1724 fn test_delete_subtree() {
1725 let mut tree = IntervalTree::new();
1727 let merge_vec = |new: Vec<i32>, mut old: Vec<i32>| {
1728 if !old.contains(&new[0]) {
1730 old.push(new[0]);
1731 old.sort_unstable();
1732 }
1733 old
1734 };
1735
1736 tree.insert(TextRange::new(0, 10), vec![0], &merge_vec);
1737 tree.insert(TextRange::new(40, 60), vec![0], &merge_vec);
1738 tree.insert(TextRange::new(41, 203), vec![-1], &merge_vec);
1739 tree.delete(TextRange::new(1, 41));
1740
1741 let results: Vec<_> = tree
1742 .find_intersects(TextRange::new(0, usize::MAX))
1743 .map(|n| (n.key, n.val.clone()))
1744 .collect();
1745 assert_eq!(
1746 results,
1747 vec![
1748 (TextRange::new(0, 1), vec![0]),
1749 (TextRange::new(41, 60), vec![-1, 0]),
1750 (TextRange::new(60, 203), vec![-1])
1751 ]
1752 );
1753 }
1754}