interval_tree/
lib.rs

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    /// perform the following operation, \\ is the red link:
51    ///      |            |
52    ///      n            x
53    ///     / \\        // \
54    ///        x    =>  n
55    ///       / \      / \
56    ///      c            c
57    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        // node and x swapped content
71        std::mem::swap(node, &mut x);
72        node.left.replace(x);
73        Some(node)
74    }
75
76    /// perform the following operation, \\ is the red link:
77    ///      |            |
78    ///      n            x
79    ///    // \          / \\
80    ///    x       =>       n
81    ///   / \              / \
82    ///      c            c
83    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    /// total number of items in this sub-tree
103    #[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    /* ------------------------------------------------------------ */
145    /*                       insertion                              */
146    /* ------------------------------------------------------------ */
147
148    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        // TODO too taunting
175        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        // cond1: r_red && !l_red
217        if Node::red(&node.right) && !Node::red(&node.left) {
218            Node::rotate_left(node)?;
219        }
220
221        // cond2: l_red && ll_red
222        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        // cond3: l_red && r_red
231        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        // update node's size
240        node.n = node.n();
241
242        // Recompute size
243        node.n = node.n();
244        Some(node)
245    }
246
247    /* ------------------------------------------------------------ */
248    /*                        deletion                              */
249    /* ------------------------------------------------------------ */
250
251    /// if node.left and node.right are both red, mark them black turn node to red.
252    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    /// rotate left if node.right is red
263    fn balance(node: &mut BoxedNode<T>) -> Option<()> {
264        if Node::red(&node.right) {
265            Node::rotate_left(node)?;
266        }
267        Some(())
268    }
269
270    /// Assuming that h is red and both h.left and h.left.left
271    /// are black, make h.left or one of its children red.
272    fn move_red_left(node: &mut BoxedNode<T>) -> Option<()> {
273        Node::flip_colors(node);
274        // h.right.left == Red
275        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        // h.left.left == Red
288        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(); // Update node count after deletion
309                result
310            }
311            None => {
312                // Replace this node with its right subtree and return the removed node
313                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(); // Update node count after deletion
334                result
335            }
336            None => {
337                // Replace this node with its left subtree and return the removed node
338                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            // n.left != red && n.left.left != red
349            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                // If the node to delete has no right child, replace it with its left subtree
362                // instead of dropping the entire subtree.
363                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(); // Update node count after deletion
398        result
399    }
400
401    /* ------------------------------------------------------------ */
402    /*                        intersection                          */
403    /* ------------------------------------------------------------ */
404
405    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    /// Recursively applies a function to each node in the tree in order.
461    /// f is mutable and has type `FnMut` because it may modify its parameters
462    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    /// Recursively applies a function to each node in the tree in order.
476    /// The function may modify `Node`.
477    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                // position is inside this interval - we need to split it
507                // Keep the first part [start, position) in this node
508                // The second part [position, end) needs to be moved to [position + length, end + length)
509                let original_end = self.key.end;
510                self.key.end = position;
511
512                // Create the second part of the split interval and collect it for later insertion
513                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)]
530/// A interval tree using red-black tree, whereas keys are intervals, and values are
531/// plists in elisp.
532///
533/// All intervals are half-opened intervals, i.e. `I = [start, end)`.These intervals
534/// are sorted by their starting point, then their ending point.
535///
536/// NOTE When inserting an interval I, if I intersects with some existing interval
537/// J but I != J, then we split & merge I and J into sub-intervals. Thus all intervals
538/// inside a interval tree will not overlap. Adjacant intervals with identical props
539/// should be merged afterwards, maybe during redisplay.
540pub struct IntervalTree<T: Clone> {
541    root: MaybeNode<T>,
542}
543
544impl<T: Clone + PartialEq> IntervalTree<T> {
545    /// Creates an empty interval tree.
546    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    /// Inserts a new interval with the specified `key` and `val` into the interval tree.
555    ///
556    /// If the interval `key` is degenerate (i.e., its start equals its end), the function
557    /// returns `None` as such intervals are not allowed in the tree. Otherwise, it delegates
558    /// the insertion to the underlying node structure.
559    ///
560    /// # Arguments
561    ///
562    /// * `key` - The text range representing the interval to insert.
563    /// * `val` - The value associated with the interval.
564    /// * `merge` - A closure that specifies how to merge intervals if they overlap
565    ///
566    /// # Returns
567    ///
568    /// An optional mutable reference to the newly inserted node, or `None` if the interval is
569    /// degenerate.
570    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    /// Finds the node with key `key` in the tree and returns its value if found.
586    ///
587    /// # Arguments
588    ///
589    /// * `key` - The text range representing the interval to search for.
590    ///
591    /// # Returns
592    ///
593    /// An optional value associated with the node if it exists, `None` otherwise.
594    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    /// Delete the node with key `key` from the tree. The `key` must excatly match
609    /// an interval in the tree.
610    ///
611    /// If the root node is the only black node, then we have to make it red
612    /// before deleting. Otherwise, the tree would become unbalanced.
613    ///
614    /// After deleting, we make sure the root node is black again.
615    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    /// Deletes the node with the minimum key from the interval tree.
634    ///
635    /// If the root node is the only black node, it is temporarily colored red
636    /// to maintain tree balance during deletion. After deletion, the root node
637    /// is recolored black to ensure the red-black tree properties are preserved.
638    ///
639    /// # Returns
640    ///
641    /// An optional `Node<T>` representing the removed node, or `None` if
642    /// the tree is empty.
643    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    /// Deletes intervals from the tree that intersect with the given range.
668    ///
669    /// Only deletes the intersecting portions of intervals, preserving
670    /// non-intersecting parts by splitting them into new intervals.
671    ///
672    /// # Arguments
673    ///
674    /// * `range` - The range to delete (can be any type that converts to `TextRange`)
675    ///
676    /// # Examples
677    ///
678    /// ```
679    /// use interval_tree::{IntervalTree, TextRange};
680    ///
681    /// let mut tree = IntervalTree::new();
682    /// tree.insert(TextRange::new(0, 10), 1, |a, _| a);
683    ///
684    /// // Delete only overlapping portion
685    /// tree.delete(TextRange::new(5, 15));
686    /// assert_eq!(tree.find_intersects(TextRange::new(0, 10)).collect::<Vec<_>>().len(), 1);
687    /// ```
688    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 is a subset of range, delete it
692            if key.start >= range.start && key.end <= range.end {
693                self.delete_exact(key);
694                continue; // Skip further processing for this key
695            }
696
697            // if key is not a subset of range but its start is within range,
698            // split it into two parts, and delete the part that is within range
699            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!(); // f will not be invoked anyway
705                        self.insert(TextRange::new(range.end, key.end), val, f);
706                    }
707                }
708                continue; // Skip further processing for this key since we've handled it
709            }
710
711            // if key is not a subset of range but its end is within range,
712            // split it into two parts, and delete the part that is within range
713            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    /// Advances all intervals in the tree by `length`, starting at
722    /// `position`. This is typically used to implement operations that insert
723    /// or delete text in a buffer.
724    pub fn advance(&mut self, position: usize, length: usize) {
725        // Collect intervals that need to be split during advance
726        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        // Insert any split intervals back into the tree
733        for (range, val) in split_intervals {
734            self.insert(range, val, |new, _old| new); // No merging needed for splits
735        }
736
737        // Automatically merge adjacent intervals with the same values
738        self.merge(|a, b| a == b);
739    }
740
741    /// Find the node whose interval contains the given `position`. If no interval
742    /// contains the position, returns `None`.
743    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    /// Find all nodes in the tree whose intervals intersect the given
749    /// `range`. The result is a vector of references to the found nodes.
750    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    /// Finds the node with the minimum key that intersects with the given range.
759    ///
760    /// This function searches for the leftmost node in the tree whose interval
761    /// overlaps with the specified range. It's useful for finding the first
762    /// intersecting interval in sorted order.
763    ///
764    /// # Arguments
765    ///
766    /// * `range` - The range to search for intersections (can be any type that converts to `TextRange`)
767    ///
768    /// # Returns
769    ///
770    /// An optional reference to the node with the minimum intersecting key, or `None`
771    /// if no intersection is found.
772    ///
773    /// # Examples
774    ///
775    /// ```
776    /// use interval_tree::{IntervalTree, TextRange};
777    ///
778    /// let mut tree = IntervalTree::new();
779    /// tree.insert(TextRange::new(0, 5), 1, |a, _| a);
780    /// tree.insert(TextRange::new(5, 10), 2, |a, _| a);
781    ///
782    /// let node = tree.find_intersect_min(TextRange::new(3, 7));
783    /// assert_eq!(node.unwrap().key, TextRange::new(0, 5));
784    /// ```
785    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    /// Like `find_intersect_min`, but finds the maximum key.
790    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    /// Return the minimum node in the tree, or `None` if the tree is empty.
795    pub fn min(&self) -> Option<&Node<T>> {
796        self.root.as_ref().map(|n| n.min())
797    }
798
799    /// Cleans the interval tree by:
800    /// 1. Removing empty intervals or intervals with empty values
801    /// 2. Merging adjacent intervals with equal values
802    ///
803    /// This function iterates through the tree in order and:
804    /// - Removes any node where the interval is empty or the value is considered empty
805    /// - Merges adjacent nodes when their values are considered equal
806    ///
807    /// # Arguments
808    ///
809    /// * `eq` - A closure that determines if two values should be considered equal
810    /// * `empty` - A closure that determines if a value should be considered empty
811    ///
812    /// # Examples
813    ///
814    /// ```
815    /// use interval_tree::{IntervalTree, TextRange};
816    ///
817    /// let mut tree = IntervalTree::new();
818    /// tree.insert(TextRange::new(0, 5), 1, |a, _| a);
819    /// tree.insert(TextRange::new(5, 10), 1, |a, _| a);
820    /// tree.insert(TextRange::new(10, 15), 2, |a, _| a);
821    /// tree.insert(TextRange::new(15, 20), 0, |a, _| a); // Empty value
822    ///
823    /// // Clean the tree, merging equal values and removing empty ones
824    /// tree.clean(|a, b| a == b, |v| *v == 0);
825    ///
826    /// assert_eq!(tree.find_intersects(TextRange::new(0, 20)).collect::<Vec<_>>().len(), 2);
827    /// ```
828    pub fn clean<F: Fn(&T, &T) -> bool, G: Fn(&T) -> bool>(&mut self, eq: F, empty: G) {
829        // Gather all intervals in order
830        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            // Queue deletions for empty nodes
838            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                    // extend current merge chain
846                    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    /// Check if the tree is in canonical form (all adjacent intervals with equal values are merged)
865    pub fn is_canonical(&self) -> bool {
866        let intervals: Vec<_> = self.find_intersects(TextRange::new(0, usize::MAX)).collect();
867
868        // Check that no two adjacent intervals have the same value
869        for window in intervals.windows(2) {
870            let current = &window[0];
871            let next = &window[1];
872
873            // If intervals are adjacent (current.end == next.start) and have equal values,
874            // the tree is not in canonical form
875            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        // Get starting key if specified
900
901        // Collect all operations to perform
902        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            // Check if current node should be deleted
910            if node.key.empty() || empty(&node.val) {
911                operations.push(Operation::Delete(node.key));
912                continue;
913            }
914
915            // Check if we can merge with previous node
916            if let Some(prev) = prev_node {
917                if prev.key.end == node.key.start && eq(&prev.val, &node.val) {
918                    // Add to current merge sequence or start new one
919                    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                    // Finalize current merge sequence
929                    operations.push(Operation::Merge(start_key, keys));
930                }
931            }
932
933            prev_node = Some(node);
934        }
935
936        // Add any remaining merge sequence
937        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    /// Merges adjacent intervals in the tree that have equal properties.
945    ///
946    /// This function iterates over the nodes in the interval tree, starting from
947    /// the minimum node. It checks if the current node's end equals the next node's
948    /// start and if their values are considered equal by the provided `equal`
949    /// function. If both conditions are met, it merges the intervals by extending
950    /// the current node's end to the next node's end and deletes the next node.
951    ///
952    /// # Arguments
953    ///
954    /// * `equal` - A closure that takes references to two values and returns `true`
955    ///   if they are considered equal, `false` otherwise.
956    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    /// Applies a transformation function to intervals that intersect with the given range,
973    /// splitting intervals as needed to apply the function only to the intersecting portions.
974    ///
975    /// The function `f` takes the current value of an interval and returns:
976    /// - `Some(new_value)` to update the interval's value
977    /// - `None` to remove the interval entirely
978    ///
979    /// If an interval only partially intersects with the range, it will be split into
980    /// non-intersecting and intersecting parts, with `f` only applied to the intersecting part.
981    ///
982    /// # Arguments
983    ///
984    /// * `f` - Transformation function to apply to intersecting intervals
985    /// * `range` - The range to check for intersections (can be any type that converts to `TextRange`)
986    ///
987    /// # Examples
988    ///
989    /// ```
990    /// use interval_tree::{IntervalTree, TextRange};
991    ///
992    /// let mut tree = IntervalTree::new();
993    /// tree.insert(TextRange::new(0, 10), 1, |a, _| a);
994    ///
995    /// // Double values in range 5-15
996    /// tree.apply_with_split(|val| Some(val * 2), TextRange::new(5, 15));
997    ///
998    /// // Remove intervals in range 7-8
999    /// tree.apply_with_split(|_| None, TextRange::new(7, 8));
1000    /// ```
1001    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        // Collect all operations to perform
1006        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                // Split left if needed
1012                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                // Split right if needed
1020                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                // Apply function to overlapping portion
1028                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        // Apply all operations
1037        self.resolve_ops(operations, &merge);
1038
1039        // Automatically merge adjacent intervals with the same values
1040        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                        // Merge all consecutive keys into one
1055                        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
1067// impl debug
1068
1069impl<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    /// Recursively print out the tree, for debugging purposes. The output format
1097    /// is not guaranteed to be stable.
1098    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>), // start_key and all consecutive keys to merge
1135    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        // Build initial stack by traversing to the starting node
1150        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        // Pop the next node to visit
1174        let node = self.stack.pop()?;
1175
1176        // Push the right subtree onto the stack
1177        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            // Traverse down the leftmost path of the right subtree
1180            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    /// Helper function to assert that a tree is in canonical form after operations
1206    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        // Test canonical form - single merged interval
1216        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        // Test non-canonical form - adjacent intervals with same value
1223        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        // Test canonical form - adjacent intervals with different values
1229        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        // Test canonical form - non-adjacent intervals with same value
1236        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        // Test empty tree
1243        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        // Build this structure:
1285        //       4
1286        //      / \
1287        //     2   6
1288        //    / \ / \
1289        //   1 3 5 7
1290        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        // let mut tree = dbg!(tree);
1398        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 mut tree = dbg!(tree);
1421        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        // Test exact match
1434        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        // Test partial overlap at start
1440        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        // Test partial overlap at end
1446        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        // Test range that spans multiple intervals
1452        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        // Test range that is completely contained within an interval
1459        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        // Test range that doesn't intersect any intervals
1464        let results = tree.find_intersects(TextRange::new(25, 30)).collect::<Vec<_>>();
1465        assert!(results.is_empty());
1466
1467        // Test empty range
1468        let results = tree.find_intersects(TextRange::new(3, 3)).collect::<Vec<_>>();
1469        assert!(results.is_empty());
1470
1471        // Test range that starts before first interval and ends after last
1472        let results = tree.find_intersects(TextRange::new(0, 25)).collect::<Vec<_>>();
1473        assert_eq!(results.len(), 4);
1474
1475        // Test single point intersection
1476        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        // Apply function to partial overlap
1566        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        // Remove an interval
1574        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); // The removed interval should be back to original value
1580
1581        // Apply to exact match
1582        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); // Empty value
1612        tree.insert(TextRange::new(20, 25), 2, merge);
1613        tree.insert(TextRange::new(25, 30), 2, merge);
1614
1615        // Clean the tree, merging equal values and removing empty ones
1616        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); // Empty interval
1635        tree.insert(TextRange::new(0, 5), 1, merge);
1636        tree.insert(TextRange::new(5, 5), 2, merge); // Empty interval
1637
1638        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        // Test exact match
1651        assert_eq!(
1652            tree.find_intersect_min(TextRange::new(5, 10)).unwrap().key,
1653            TextRange::new(5, 10)
1654        );
1655
1656        // Test partial overlap
1657        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        // Test no overlap
1668        assert!(tree.find_intersect_min(TextRange::new(19, 23)).is_none());
1669
1670        // Test empty tree
1671        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        // Regression test for delete method bug where get_node_mut would fail
1678        // with unwrap() on None when trying to access nodes after they were modified
1679
1680        let mut tree = IntervalTree::new();
1681
1682        // Insert a large interval
1683        tree.insert(TextRange::new(0, 100), vec![42], |mut new, mut old| {
1684            new.append(&mut old);
1685            new
1686        });
1687
1688        // Delete a portion in the middle (partial delete)
1689        // This should split the interval into [0, 30) and [80, 100)
1690        tree.delete(TextRange::new(30, 80));
1691
1692        // Verify the result
1693        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        // Ensure the deleted middle portion is gone
1703        assert!(tree.find_intersects(TextRange::new(40, 70)).next().is_none());
1704    }
1705
1706    #[test]
1707    fn test_delete_exact_preserves_left_subtree() {
1708        // Ensure deleting a node with no right child preserves its left subtree
1709        // Build a tree where the node [69,70) has a left subtree and no right child
1710        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        // Delete the node with no right child; its left child should remain
1717        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        // Reproduce the minimal failing input from proptest
1726        let mut tree = IntervalTree::new();
1727        let merge_vec = |new: Vec<i32>, mut old: Vec<i32>| {
1728            // proptest uses a merge that dedups and sorts
1729            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}