Skip to main content

bed_utils/
intervaltree.rs

1//! This module provides a simple data-structure for fast interval searches.
2//! ## Features
3//! - Extremely fast on most genomic datasets. (3-4x faster than other methods)
4//! - Extremely fast on in order queries. (10x faster than other methods)
5//! - Extremely fast intersections count method based on the
6//! [BITS](https://arxiv.org/pdf/1208.3407.pdf) algorithm
7//! - Parallel friendly. Queries are on an immutable structure, even for seek
8//! - Consumer / Adapter paradigm, Iterators are returned and serve as the main API for interacting
9//! with the lapper
10//!
11//! ## Details:
12//!
13//! ```text
14//!       0  1  2  3  4  5  6  7  8  9  10 11
15//! (0,10]X  X  X  X  X  X  X  X  X  X
16//! (2,5]       X  X  X
17//! (3,8]          X  X  X  X  X
18//! (3,8]          X  X  X  X  X
19//! (3,8]          X  X  X  X  X
20//! (3,8]          X  X  X  X  X
21//! (5,9]                X  X  X  X
22//! (8,11]                        X  X  X
23//!
24//! Query: (8, 11]
25//! Answer: ((0,10], (5,9], (8,11])
26//! ```
27//!
28//! Most interaction with this crate will be through the [`Lapper`](struct.Lapper.html) struct
29//! The main methods are [`find`](struct.Lapper.html#method.find),
30//! [`seek`](struct.Lapper.html#method.seek), and [`count`](struct.Lapper.html#method.count)
31//! where both `seek` and `count` are special cases allowing for very fast queries in certain scenarios.
32//!
33//! The overlap function for this assumes a zero based genomic coordinate system. So [start, stop)
34//! is not inclusive of the stop position for neither the queries, nor the Intervals.
35//!
36//! Lapper does not use an interval tree, instead, it operates on the assumtion that most intervals are
37//! of similar length; or, more exactly, that the longest interval in the set is not long compred to
38//! the average distance between intervals.
39//!
40//! For cases where this holds true (as it often does with genomic data), we can sort by start and
41//! use binary search on the starts, accounting for the length of the longest interval. The advantage
42//! of this approach is simplicity of implementation and speed. In realistic tests queries returning
43//! the overlapping intervals are 1000 times faster than brute force and queries that merely check
44//! for the overlaps are > 5000 times faster.
45//!
46//! When this is not the case, if possible in your scenario, use merge_overlaps first, and then use
47//! `find` or `seek`. The `count` method will be fast in all scenarios.
48//!
49//! # Examples
50//!
51//! ```rust
52//!    use bed_utils::intervaltree::{Interval, Lapper};
53//!    use std::cmp;
54//!    type Iv = Interval<usize, u32>;
55//!
56//!    // create some fake data
57//!    let data: Vec<Iv> = (0..20).step_by(5).map(|x| Iv{start: x, stop: x + 2, val: 0}).collect();
58//!    println!("{:#?}", data);
59//!
60//!    // make lapper structure
61//!    let laps = Lapper::new(data);
62//!
63//!    assert_eq!(laps.find(6, 11).next(), Some(&Iv{start: 5, stop: 7, val: 0}));
64//!
65//!    // Demonstration of seek function. By passing in the &mut cursor, seek can have thread local
66//!    // cursors going
67//!    let mut sim: usize = 0;
68//!    let mut cursor = 0;
69//!    // Calculate the overlap between the query and the found intervals, sum total overlap
70//!    for i in (0..10).step_by(3) {
71//!        sim += laps
72//!            .seek(i, i + 2, &mut cursor)
73//!            .map(|iv| cmp::min(i + 2, iv.stop) - cmp::max(i, iv.start))
74//!            .sum::<usize>();
75//!    }
76//!    assert_eq!(sim, 4);
77//! ```
78use num_traits::{
79    identities::{one, zero},
80    PrimInt,
81};
82use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
83use std::cmp::Ordering::{self};
84use std::collections::VecDeque;
85
86/// Represent a range from [start, stop)
87/// Inclusive start, exclusive of stop
88#[derive(Archive, RkyvSerialize, RkyvDeserialize, Debug, Clone)]
89pub struct Interval<I, T> {
90    pub start: I,
91    pub stop: I,
92    pub val: T,
93}
94
95/// Primary object of the library. The public intervals holds all the intervals and can be used for
96/// iterating / pulling values out of the tree.
97#[derive(Archive, RkyvSerialize, RkyvDeserialize, Debug, Clone)]
98pub struct Lapper<I, T> {
99    /// List of intervals
100    pub intervals: Vec<Interval<I, T>>,
101    /// Sorted list of start positions,
102    starts: Vec<I>,
103    /// Sorted list of end positions,
104    stops: Vec<I>,
105    /// The length of the longest interval
106    max_len: I,
107    /// The calculated number of positions covered by the intervals
108    cov: Option<I>,
109    /// Whether or not overlaps have been merged
110    pub overlaps_merged: bool,
111}
112
113impl<I: PrimInt, T> Interval<I, T> {
114    /// Compute the intsect between two intervals
115    #[inline]
116    pub fn intersect(&self, other: &Interval<I, T>) -> I {
117        std::cmp::min(self.stop, other.stop)
118            .checked_sub(std::cmp::max(&self.start, &other.start))
119            .unwrap_or_else(zero::<I>)
120    }
121
122    /// Check if two intervals overlap
123    #[inline]
124    pub fn overlap(&self, start: I, stop: I) -> bool {
125        self.start < stop && self.stop > start
126    }
127}
128
129impl<I: Ord, T> Ord for Interval<I, T> {
130    #[inline]
131    fn cmp(&self, other: &Interval<I, T>) -> Ordering {
132        match self.start.cmp(&other.start) {
133            Ordering::Less => Ordering::Less,
134            Ordering::Greater => Ordering::Greater,
135            Ordering::Equal => self.stop.cmp(&other.stop),
136        }
137    }
138}
139
140impl<I: PartialEq, T> Eq for Interval<I, T> {}
141
142impl<I: Ord, T> PartialOrd for Interval<I, T> {
143    #[inline]
144    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
145        Some(self.cmp(other))
146    }
147}
148
149impl<I: PartialEq, T> PartialEq for Interval<I, T> {
150    #[inline]
151    fn eq(&self, other: &Interval<I, T>) -> bool {
152        self.start == other.start && self.stop == other.stop
153    }
154}
155
156impl<I: PrimInt, T> Lapper<I, T> {
157    /// Create a new instance of Lapper by passing in a vector of Intervals. This vector will
158    /// immediately be sorted by start order.
159    /// ```
160    /// use bed_utils::intervaltree::{Lapper, Interval};
161    /// let data = (0..20).step_by(5)
162    ///                   .map(|x| Interval{start: x, stop: x + 10, val: true})
163    ///                   .collect::<Vec<Interval<usize, bool>>>();
164    /// let lapper = Lapper::new(data);
165    /// ```
166    pub fn new(mut intervals: Vec<Interval<I, T>>) -> Self {
167        intervals.sort();
168        let (mut starts, mut stops): (Vec<_>, Vec<_>) =
169            intervals.iter().map(|x| (x.start, x.stop)).unzip();
170        starts.sort();
171        stops.sort();
172        let mut max_len = zero::<I>();
173        for interval in intervals.iter() {
174            let i_len = interval
175                .stop
176                .checked_sub(&interval.start)
177                .unwrap_or_else(zero::<I>);
178            if i_len > max_len {
179                max_len = i_len;
180            }
181        }
182        Lapper {
183            intervals,
184            starts,
185            stops,
186            max_len,
187            cov: None,
188            overlaps_merged: false,
189        }
190    }
191
192    /// Insert a new interval after the Lapper has been created. This is very
193    /// inefficient and should be avoided if possible.
194    ///
195    /// SIDE EFFECTS: This clears cov() and overlaps_merged
196    /// meaning that those will have to be recomputed after a insert
197    /// ```
198    /// use bed_utils::intervaltree::{Lapper, Interval};
199    /// let data : Vec<Interval<usize, usize>>= vec!{
200    ///     Interval{start:0,  stop:5,  val:1},
201    ///     Interval{start:6,  stop:10, val:2},
202    /// };
203    /// let mut lapper = Lapper::new(data);
204    /// lapper.insert(Interval{start:0, stop:20, val:5});
205    /// assert_eq!(lapper.len(), 3);
206    /// assert_eq!(lapper.find(1,3).collect::<Vec<&Interval<usize,usize>>>(),
207    ///     vec![
208    ///         &Interval{start:0, stop:5, val:1},
209    ///         &Interval{start:0, stop:20, val:5},
210    ///     ]
211    /// );
212    ///
213    /// ```
214    pub fn insert(&mut self, elem: Interval<I, T>) {
215        let starts_insert_index = Self::bsearch_seq(elem.start, &self.starts);
216        let stops_insert_index = Self::bsearch_seq(elem.stop, &self.stops);
217        let intervals_insert_index = Self::bsearch_seq_ref(&elem, &self.intervals);
218        let i_len = elem.stop.checked_sub(&elem.start).unwrap_or_else(zero::<I>);
219        if i_len > self.max_len {
220            self.max_len = i_len;
221        }
222        self.starts.insert(starts_insert_index, elem.start);
223        self.stops.insert(stops_insert_index, elem.stop);
224        self.intervals.insert(intervals_insert_index, elem);
225        self.cov = None;
226        self.overlaps_merged = false;
227    }
228
229    /// Get the number over intervals in Lapper
230    /// ```
231    /// use bed_utils::intervaltree::{Lapper, Interval};
232    /// let data = (0..20).step_by(5)
233    ///                   .map(|x| Interval{start: x, stop: x + 10, val: true})
234    ///                   .collect::<Vec<Interval<usize, bool>>>();
235    /// let lapper = Lapper::new(data);
236    /// assert_eq!(lapper.len(), 4);
237    /// ```
238    #[inline]
239    pub fn len(&self) -> usize {
240        self.intervals.len()
241    }
242
243    /// Check if lapper is empty
244    /// ```
245    /// use bed_utils::intervaltree::{Lapper, Interval};
246    /// let data: Vec<Interval<usize, bool>> = vec![];
247    /// let lapper = Lapper::new(data);
248    /// assert_eq!(lapper.is_empty(), true);
249    /// ```
250    #[inline]
251    pub fn is_empty(&self) -> bool {
252        self.intervals.is_empty()
253    }
254
255    /// Get the number of positions covered by the intervals in Lapper. This provides immutable
256    /// access if it has already been set, or on the fly calculation.
257    /// ```
258    /// use bed_utils::intervaltree::{Lapper, Interval};
259    /// let data = (0..20).step_by(5)
260    ///                   .map(|x| Interval{start: x, stop: x + 10, val: true})
261    ///                   .collect::<Vec<Interval<usize, bool>>>();
262    /// let lapper = Lapper::new(data);
263    /// assert_eq!(lapper.cov(), 25);
264    #[inline]
265    pub fn cov(&self) -> I {
266        match self.cov {
267            None => self.calculate_coverage(),
268            Some(cov) => cov,
269        }
270    }
271
272    /// Get the number fo positions covered by the intervals in Lapper and store it. If you are
273    /// going to be using the coverage, you should set it to avoid calculating it over and over.
274    pub fn set_cov(&mut self) -> I {
275        let cov = self.calculate_coverage();
276        self.cov = Some(cov);
277        cov
278    }
279
280    /// Calculate the actual coverage behind the scenes.
281    fn calculate_coverage(&self) -> I {
282        let mut moving_interval = Interval {
283            start: zero::<I>(),
284            stop: zero::<I>(),
285            val: zero::<I>(),
286        };
287        let mut cov = zero::<I>();
288
289        for interval in self.intervals.iter() {
290            // If it overlaps, embrace, extend, extinguish
291            if moving_interval.overlap(interval.start, interval.stop) {
292                moving_interval.start = std::cmp::min(moving_interval.start, interval.start);
293                moving_interval.stop = std::cmp::max(moving_interval.stop, interval.stop);
294            } else {
295                // add the set and move on
296                cov = cov + (moving_interval.stop - moving_interval.start);
297                moving_interval.start = interval.start;
298                moving_interval.stop = interval.stop;
299            }
300        }
301        // add in the last bit
302        cov = cov + (moving_interval.stop - moving_interval.start);
303        cov
304    }
305
306    /// Return an iterator over the intervals in Lapper
307    #[inline]
308    pub fn iter(&self) -> IterLapper<'_, I, T> {
309        IterLapper {
310            inner: self,
311            pos: 0,
312        }
313    }
314
315    /// Determine the first index that we should start checking for overlaps for via a binary
316    /// search.
317    /// Assumes that the maximum interval length in `intervals` has been subtracted from
318    /// `start`, otherwise the result is undefined
319    #[inline]
320    pub fn lower_bound(start: I, intervals: &[Interval<I, T>]) -> usize {
321        let mut size = intervals.len();
322        let mut low = 0;
323
324        while size > 0 {
325            let half = size / 2;
326            let other_half = size - half;
327            let probe = low + half;
328            let other_low = low + other_half;
329            let v = &intervals[probe];
330            size = half;
331            low = if v.start < start { other_low } else { low }
332        }
333        low
334    }
335
336    #[inline]
337    pub fn bsearch_seq<K>(key: K, elems: &[K]) -> usize
338    where
339        K: PartialEq + PartialOrd,
340    {
341        Self::bsearch_seq_ref(&key, elems)
342    }
343
344    #[inline]
345    pub fn bsearch_seq_ref<K>(key: &K, elems: &[K]) -> usize
346    where
347        K: PartialEq + PartialOrd,
348    {
349        if elems.is_empty() || elems[0] >= *key {
350            return 0;
351        } else if elems[elems.len() - 1] < *key {
352            return elems.len();
353        }
354        let mut cursor = 0;
355        let mut length = elems.len();
356        while length > 1 {
357            let half = length >> 1;
358            length -= half;
359            cursor += (usize::from(elems[cursor + half - 1] < *key)) * half;
360        }
361        cursor
362    }
363
364    /// Find the union and the intersect of two lapper objects.
365    /// Union: The set of positions found in both lappers
366    /// Intersect: The number of positions where both lappers intersect. Note that a position only
367    /// counts one time, multiple Intervals covering the same position don't add up.
368    /// ``` rust
369    /// use bed_utils::intervaltree::{Lapper, Interval};
370    /// type Iv = Interval<u32, u32>;
371    /// let data1: Vec<Iv> = vec![
372    ///     Iv{start: 70, stop: 120, val: 0}, // max_len = 50
373    ///     Iv{start: 10, stop: 15, val: 0}, // exact overlap
374    ///     Iv{start: 12, stop: 15, val: 0}, // inner overlap
375    ///     Iv{start: 14, stop: 16, val: 0}, // overlap end
376    ///     Iv{start: 68, stop: 71, val: 0}, // overlap start
377    /// ];
378    /// let data2: Vec<Iv> = vec![
379    ///
380    ///     Iv{start: 10, stop: 15, val: 0},
381    ///     Iv{start: 40, stop: 45, val: 0},
382    ///     Iv{start: 50, stop: 55, val: 0},
383    ///     Iv{start: 60, stop: 65, val: 0},
384    ///     Iv{start: 70, stop: 75, val: 0},
385    /// ];
386    ///
387    /// let (mut lapper1, mut lapper2) = (Lapper::new(data1), Lapper::new(data2)) ;
388    /// // Should be the same either way it's calculated
389    /// let (union, intersect) = lapper1.union_and_intersect(&lapper2);
390    /// assert_eq!(intersect, 10);
391    /// assert_eq!(union, 73);
392    /// let (union, intersect) = lapper2.union_and_intersect(&lapper1);
393    /// assert_eq!(intersect, 10);
394    /// assert_eq!(union, 73);
395    /// lapper1.merge_overlaps();
396    /// lapper1.set_cov();
397    /// lapper2.merge_overlaps();
398    /// lapper2.set_cov();
399    ///
400    /// // Should be the same either way it's calculated
401    /// let (union, intersect) = lapper1.union_and_intersect(&lapper2);
402    /// assert_eq!(intersect, 10);
403    /// assert_eq!(union, 73);
404    /// let (union, intersect) = lapper2.union_and_intersect(&lapper1);
405    /// assert_eq!(intersect, 10);
406    /// assert_eq!(union, 73);
407    /// ```
408    #[inline]
409    pub fn union_and_intersect(&self, other: &Self) -> (I, I) {
410        let mut cursor: usize = 0;
411
412        if !self.overlaps_merged || !other.overlaps_merged {
413            let mut intersections: Vec<Interval<I, bool>> = vec![];
414            for self_iv in self.iter() {
415                for other_iv in other.seek(self_iv.start, self_iv.stop, &mut cursor) {
416                    let start = std::cmp::max(self_iv.start, other_iv.start);
417                    let stop = std::cmp::min(self_iv.stop, other_iv.stop);
418                    intersections.push(Interval {
419                        start,
420                        stop,
421                        val: true,
422                    });
423                }
424            }
425            let mut temp_lapper = Lapper::new(intersections);
426            temp_lapper.merge_overlaps();
427            temp_lapper.set_cov();
428            let union = self.cov() + other.cov() - temp_lapper.cov();
429            (union, temp_lapper.cov())
430        } else {
431            let mut intersect = zero::<I>();
432            for c1_iv in self.iter() {
433                for c2_iv in other.seek(c1_iv.start, c1_iv.stop, &mut cursor) {
434                    let local_intersect = c1_iv.intersect(c2_iv);
435                    intersect = intersect + local_intersect;
436                }
437            }
438            let union = self.cov() + other.cov() - intersect;
439            (union, intersect)
440        }
441    }
442
443    /// Find the intersect of two lapper objects.
444    /// Intersect: The number of positions where both lappers intersect. Note that a position only
445    /// counts one time, multiple Intervals covering the same position don't add up
446    #[inline]
447    pub fn intersect(&self, other: &Self) -> I {
448        self.union_and_intersect(other).1
449    }
450
451    /// Find the union of two lapper objects.
452    #[inline]
453    pub fn union(&self, other: &Self) -> I {
454        self.union_and_intersect(other).0
455    }
456
457    /// Return the contiguous intervals of coverage, `val` represents the number of intervals
458    /// covering the returned interval.
459    ///
460    /// # Examples
461    /// ```
462    /// use bed_utils::intervaltree::{Lapper, Interval};
463    /// let data = (0..20).step_by(5)
464    ///                   .map(|x| Interval{start: x, stop: x + 10, val: true})
465    ///                   .collect::<Vec<Interval<usize, bool>>>();
466    /// let lapper = Lapper::new(data);
467    /// assert_eq!(lapper.depth().collect::<Vec<Interval<usize, usize>>>(), vec![
468    ///             Interval { start: 0, stop: 5, val: 1 },
469    ///             Interval { start: 5, stop: 20, val: 2 },
470    ///             Interval { start: 20, stop: 25, val: 1 }]);
471    /// ```
472    #[inline]
473    pub fn depth(&self) -> IterDepth<'_, I, T> {
474        let mut merged_lapper = Lapper::new(
475            self.intervals
476                .iter()
477                .map(|i| Interval {
478                    start: i.start,
479                    stop: i.stop,
480                    val: true,
481                })
482                .collect::<Vec<Interval<I, bool>>>(),
483        );
484        merged_lapper.merge_overlaps();
485        let merged_len = merged_lapper.intervals.len();
486        IterDepth {
487            inner: self,
488            merged: merged_lapper,
489            curr_merged_pos: zero::<I>(),
490            curr_pos: 0,
491            cursor: 0,
492            end: merged_len,
493        }
494    }
495
496    /// Count all intervals that overlap start .. stop. This performs two binary search in order to
497    /// find all the excluded elements, and then deduces the intersection from there. See
498    /// [BITS](https://arxiv.org/pdf/1208.3407.pdf) for more details.
499    /// ```
500    /// use bed_utils::intervaltree::{Lapper, Interval};
501    /// let lapper = Lapper::new((0..100).step_by(5)
502    ///                                 .map(|x| Interval{start: x, stop: x+2 , val: true})
503    ///                                 .collect::<Vec<Interval<usize, bool>>>());
504    /// assert_eq!(lapper.count(5, 11), 2);
505    /// ```
506    #[inline]
507    pub fn count(&self, start: I, stop: I) -> usize {
508        let len = self.intervals.len();
509        // Plus one to account for half-openness of lapper intervals compared to BITS paper
510        let first = Self::bsearch_seq(start + one::<I>(), &self.stops);
511        let last = Self::bsearch_seq(stop, &self.starts);
512        let num_cant_after = len - last;
513        len - first - num_cant_after
514    }
515
516    /// Find all intervals that overlap start .. stop
517    /// ```
518    /// use bed_utils::intervaltree::{Lapper, Interval};
519    /// let lapper = Lapper::new((0..100).step_by(5)
520    ///                                 .map(|x| Interval{start: x, stop: x+2 , val: true})
521    ///                                 .collect::<Vec<Interval<usize, bool>>>());
522    /// assert_eq!(lapper.find(5, 11).count(), 2);
523    /// ```
524    #[inline]
525    pub fn find(&self, start: I, stop: I) -> IterFind<'_, I, T> {
526        IterFind {
527            inner: self,
528            off: Self::lower_bound(
529                start.checked_sub(&self.max_len).unwrap_or_else(zero::<I>),
530                &self.intervals,
531            ),
532            start,
533            stop,
534        }
535    }
536
537    /// Find all intevals that overlap start .. stop. This method will work when queries
538    /// to this lapper are in sorted (start) order. It uses a linear search from the last query
539    /// instead of a binary search. A reference to a cursor must be passed in. This reference will
540    /// be modified and should be reused in the next query. This allows seek to not need to make
541    /// the lapper object mutable, and thus use the same lapper accross threads.
542    /// ```
543    /// use bed_utils::intervaltree::{Lapper, Interval};
544    /// let lapper = Lapper::new((0..100).step_by(5)
545    ///                                 .map(|x| Interval{start: x, stop: x+2 , val: true})
546    ///                                 .collect::<Vec<Interval<usize, bool>>>());
547    /// let mut cursor = 0;
548    /// for i in lapper.iter() {
549    ///    assert_eq!(lapper.seek(i.start, i.stop, &mut cursor).count(), 1);
550    /// }
551    /// ```
552    #[inline]
553    pub fn seek<'a>(&'a self, start: I, stop: I, cursor: &mut usize) -> IterFind<'a, I, T> {
554        if *cursor == 0 || (*cursor < self.intervals.len() && self.intervals[*cursor].start > start)
555        {
556            *cursor = Self::lower_bound(
557                start.checked_sub(&self.max_len).unwrap_or_else(zero::<I>),
558                &self.intervals,
559            );
560        }
561
562        while *cursor + 1 < self.intervals.len()
563            && self.intervals[*cursor + 1].start
564                < start.checked_sub(&self.max_len).unwrap_or_else(zero::<I>)
565        {
566            *cursor += 1;
567        }
568
569        IterFind {
570            inner: self,
571            off: *cursor,
572            start,
573            stop,
574        }
575    }
576}
577
578impl<I: PrimInt, T: Clone> Lapper<I, T> {
579    /// Merge any intervals that overlap with eachother within the Lapper. This is an easy way to
580    /// speed up queries.
581    pub fn merge_overlaps(&mut self) {
582        let mut stack: VecDeque<&mut Interval<I, T>> = VecDeque::new();
583        let mut ivs = self.intervals.iter_mut();
584        if let Some(first) = ivs.next() {
585            stack.push_back(first);
586            for interval in ivs {
587                let top = stack.pop_back().unwrap();
588                if top.stop < interval.start {
589                    stack.push_back(top);
590                    stack.push_back(interval);
591                } else if top.stop < interval.stop {
592                    top.stop = interval.stop;
593                    //stack.pop_back();
594                    stack.push_back(top);
595                } else {
596                    // they were equal
597                    stack.push_back(top);
598                }
599            }
600            self.overlaps_merged = true;
601            self.intervals = stack
602                .into_iter()
603                .map(|x| Interval {
604                    start: x.start,
605                    stop: x.stop,
606                    val: x.val.clone(),
607                })
608                .collect();
609        }
610        // Fix the starts and stops used by counts
611        let (mut starts, mut stops): (Vec<_>, Vec<_>) =
612            self.intervals.iter().map(|x| (x.start, x.stop)).unzip();
613        starts.sort();
614        stops.sort();
615        self.starts = starts;
616        self.stops = stops;
617        self.max_len = self
618            .intervals
619            .iter()
620            .map(|x| x.stop.checked_sub(&x.start).unwrap_or_else(zero::<I>))
621            .max()
622            .unwrap_or_else(zero::<I>);
623    }
624}
625
626/// Find Iterator
627#[derive(Debug)]
628pub struct IterFind<'a, I, T> {
629    inner: &'a Lapper<I, T>,
630    off: usize,
631    start: I,
632    stop: I,
633}
634
635impl<'a, I: PrimInt, T> Iterator for IterFind<'a, I, T> {
636    type Item = &'a Interval<I, T>;
637
638    #[inline]
639    // interval.start < stop && interval.stop > start
640    fn next(&mut self) -> Option<Self::Item> {
641        while self.off < self.inner.intervals.len() {
642            //let mut generator = self.inner.intervals[self.off..].iter();
643            //while let Some(interval) = generator.next() {
644            let interval = &self.inner.intervals[self.off];
645            self.off += 1;
646            if interval.overlap(self.start, self.stop) {
647                return Some(interval);
648            } else if interval.start >= self.stop {
649                break;
650            }
651        }
652        None
653    }
654}
655
656/// Depth Iterator
657#[derive(Debug)]
658pub struct IterDepth<'a, I, T> {
659    inner: &'a Lapper<I, T>,
660    merged: Lapper<I, bool>, // A lapper that is the merged_lapper of inner
661    curr_merged_pos: I,      // Current start position in current interval
662    curr_pos: usize,         // In merged list of non-overlapping intervals
663    cursor: usize,           // cursor for seek over inner lapper
664    end: usize,              // len of merged
665}
666
667impl<'a, I: PrimInt, T: Clone> Iterator for IterDepth<'a, I, T> {
668    type Item = Interval<I, I>;
669
670    #[inline]
671    fn next(&mut self) -> Option<Self::Item> {
672        let mut interval: &Interval<I, bool> = &self.merged.intervals[self.curr_pos];
673        if self.curr_merged_pos == zero::<I>() {
674            self.curr_merged_pos = interval.start;
675        }
676        if interval.stop == self.curr_merged_pos {
677            if self.curr_pos + 1 != self.end {
678                self.curr_pos += 1;
679                interval = &self.merged.intervals[self.curr_pos];
680                self.curr_merged_pos = interval.start;
681            } else {
682                return None;
683            }
684        }
685        let start = self.curr_merged_pos;
686        let depth_at_point = self
687            .inner
688            .seek(
689                self.curr_merged_pos,
690                self.curr_merged_pos + one::<I>(),
691                &mut self.cursor,
692            )
693            .count();
694        let mut new_depth_at_point = depth_at_point;
695        while new_depth_at_point == depth_at_point && self.curr_merged_pos < interval.stop {
696            self.curr_merged_pos = self.curr_merged_pos + one::<I>();
697            new_depth_at_point = self
698                .inner
699                .seek(
700                    self.curr_merged_pos,
701                    self.curr_merged_pos + one::<I>(),
702                    &mut self.cursor,
703                )
704                .count();
705        }
706        Some(Interval {
707            start,
708            stop: self.curr_merged_pos,
709            val: I::from(depth_at_point).unwrap(), // from usize should always work
710        })
711    }
712}
713/// Lapper Iterator
714pub struct IterLapper<'a, I, T> {
715    inner: &'a Lapper<I, T>,
716    pos: usize,
717}
718
719impl<'a, I, T> Iterator for IterLapper<'a, I, T> {
720    type Item = &'a Interval<I, T>;
721
722    fn next(&mut self) -> Option<Self::Item> {
723        if self.pos >= self.inner.intervals.len() {
724            None
725        } else {
726            self.pos += 1;
727            self.inner.intervals.get(self.pos - 1)
728        }
729    }
730}
731
732impl<I, T> IntoIterator for Lapper<I, T> {
733    type Item = Interval<I, T>;
734    type IntoIter = ::std::vec::IntoIter<Self::Item>;
735
736    fn into_iter(self) -> Self::IntoIter {
737        self.intervals.into_iter()
738    }
739}
740
741impl<'a, I, T> IntoIterator for &'a Lapper<I, T> {
742    type Item = &'a Interval<I, T>;
743    type IntoIter = std::slice::Iter<'a, Interval<I, T>>;
744
745    fn into_iter(self) -> std::slice::Iter<'a, Interval<I, T>> {
746        self.intervals.iter()
747    }
748}
749
750impl<'a, I, T> IntoIterator for &'a mut Lapper<I, T> {
751    type Item = &'a mut Interval<I, T>;
752    type IntoIter = std::slice::IterMut<'a, Interval<I, T>>;
753
754    fn into_iter(self) -> std::slice::IterMut<'a, Interval<I, T>> {
755        self.intervals.iter_mut()
756    }
757}
758
759#[cfg(test)]
760#[rustfmt::skip]
761mod tests {
762    use super::*;
763
764    type Iv = Interval<usize, u32>;
765    fn setup_nonoverlapping() -> Lapper<usize, u32> {
766        let data: Vec<Iv> = (0..100)
767            .step_by(20)
768            .map(|x| Iv {
769                start: x,
770                stop: x + 10,
771                val: 0,
772            })
773            .collect();
774        Lapper::new(data)
775    }
776
777    fn setup_overlapping() -> Lapper<usize, u32> {
778        let data: Vec<Iv> = (0..100)
779            .step_by(10)
780            .map(|x| Iv {
781                start: x,
782                stop: x + 15,
783                val: 0,
784            })
785            .collect();
786        Lapper::new(data)
787    }
788
789    fn setup_badlapper() -> Lapper<usize, u32> {
790        let data: Vec<Iv> = vec![
791            Iv{start: 70, stop: 120, val: 0}, // max_len = 50
792            Iv{start: 10, stop: 15, val: 0},
793            Iv{start: 10, stop: 15, val: 0}, // exact overlap
794            Iv{start: 12, stop: 15, val: 0}, // inner overlap
795            Iv{start: 14, stop: 16, val: 0}, // overlap end
796            Iv{start: 40, stop: 45, val: 0},
797            Iv{start: 50, stop: 55, val: 0},
798            Iv{start: 60, stop: 65, val: 0},
799            Iv{start: 68, stop: 71, val: 0}, // overlap start
800            Iv{start: 70, stop: 75, val: 0},
801        ];
802        Lapper::new(data)
803    }
804
805    fn setup_single() -> Lapper<usize, u32> {
806        let data: Vec<Iv> = vec![Iv {
807            start: 10,
808            stop: 35,
809            val: 0,
810        }];
811        Lapper::new(data)
812    }
813
814    // Test that inserting data ends up with the same lapper (nonoverlapping)
815    #[test]
816    fn insert_equality_nonoverlapping() {
817        let data: Vec<Iv> = (0..100)
818            .step_by(20)
819            .map(|x| Iv {
820                start: x,
821                stop: x + 10,
822                val: 0,
823            })
824            .collect();
825        let new_lapper = Lapper::new(data.clone());
826        let mut insert_lapper = Lapper::new(vec![]);
827        for elem in data {
828            insert_lapper.insert(elem);
829        }
830        assert_eq!(new_lapper.starts, insert_lapper.starts);
831        assert_eq!(new_lapper.stops, insert_lapper.stops);
832        assert_eq!(new_lapper.intervals, insert_lapper.intervals);
833        assert_eq!(new_lapper.max_len, insert_lapper.max_len);
834    }
835
836    // Test that inserting data ends up with the same lapper (overlapping)
837    #[test]
838    fn insert_equality_overlapping() {
839        let data: Vec<Iv> = (0..100)
840            .step_by(10)
841            .map(|x| Iv {
842                start: x,
843                stop: x + 15,
844                val: 0,
845            })
846            .collect();
847        let new_lapper = Lapper::new(data.clone());
848        let mut insert_lapper = Lapper::new(vec![]);
849        for elem in data {
850            insert_lapper.insert(elem);
851        }
852        assert_eq!(new_lapper.starts, insert_lapper.starts);
853        assert_eq!(new_lapper.stops, insert_lapper.stops);
854        assert_eq!(new_lapper.intervals, insert_lapper.intervals);
855        assert_eq!(new_lapper.max_len, insert_lapper.max_len);
856    }
857
858    // Test that inserting data half with new and half with insert
859    // ends up with the same lapper
860    #[test]
861    fn insert_equality_half_and_half() {
862        let data: Vec<Iv> = (0..100)
863            .step_by(1)
864            .map(|x| Iv {
865                start: x,
866                stop: x + 15,
867                val: 0,
868            })
869            .collect();
870        let new_lapper = Lapper::new(data.clone());
871        let (new_data, insert_data) = data.split_at(50);
872        let mut insert_lapper = Lapper::new(new_data.to_vec());
873        let mut insert_data = insert_data.to_vec();
874        insert_data.reverse();
875        for elem in insert_data {
876            insert_lapper.insert(elem);
877        }
878        assert_eq!(new_lapper.starts, insert_lapper.starts);
879        assert_eq!(new_lapper.stops, insert_lapper.stops);
880        assert_eq!(new_lapper.intervals, insert_lapper.intervals);
881        assert_eq!(new_lapper.max_len, insert_lapper.max_len);
882    }
883
884    // Test that inserting data ends up with the same lapper (badlapper)
885    #[test]
886    fn insert_equality_badlapper() {
887        let data: Vec<Iv> = vec![
888            Iv{start: 70, stop: 120, val: 0}, // max_len = 50
889            Iv{start: 10, stop: 15, val: 0},
890            Iv{start: 10, stop: 15, val: 0}, // exact overlap
891            Iv{start: 12, stop: 15, val: 0}, // inner overlap
892            Iv{start: 14, stop: 16, val: 0}, // overlap end
893            Iv{start: 40, stop: 45, val: 0},
894            Iv{start: 50, stop: 55, val: 0},
895            Iv{start: 60, stop: 65, val: 0},
896            Iv{start: 68, stop: 71, val: 0}, // overlap start
897            Iv{start: 70, stop: 75, val: 0},
898        ];
899        let new_lapper = Lapper::new(data.clone());
900        let mut insert_lapper = Lapper::new(vec![]);
901        for elem in data {
902            insert_lapper.insert(elem);
903        }
904        assert_eq!(new_lapper.starts, insert_lapper.starts);
905        assert_eq!(new_lapper.stops, insert_lapper.stops);
906        assert_eq!(new_lapper.intervals, insert_lapper.intervals);
907        assert_eq!(new_lapper.max_len, insert_lapper.max_len);
908    }
909
910    // Test that inserting data ends up with the same lapper (single)
911    #[test]
912    fn insert_equality_single() {
913        let data: Vec<Iv> = vec![Iv {
914            start: 10,
915            stop: 35,
916            val: 0,
917        }];
918        let new_lapper = Lapper::new(data.clone());
919        let mut insert_lapper = Lapper::new(vec![]);
920        for elem in data {
921            insert_lapper.insert(elem);
922        }
923        assert_eq!(new_lapper.starts, insert_lapper.starts);
924        assert_eq!(new_lapper.stops, insert_lapper.stops);
925        assert_eq!(new_lapper.intervals, insert_lapper.intervals);
926        assert_eq!(new_lapper.max_len, insert_lapper.max_len);
927    }
928
929    // Test that a query stop that hits an interval start returns no interval
930    #[test]
931    fn test_query_stop_interval_start() {
932        let lapper = setup_nonoverlapping();
933        let mut cursor = 0;
934        assert_eq!(None, lapper.find(15, 20).next());
935        assert_eq!(None, lapper.seek(15, 20, &mut cursor).next());
936        assert_eq!(lapper.find(15, 20).count(), lapper.count(15, 20));
937    }
938
939    // Test that a query start that hits an interval end returns no interval
940    #[test]
941    fn test_query_start_interval_stop() {
942        let lapper = setup_nonoverlapping();
943        let mut cursor = 0;
944        assert_eq!(None, lapper.find(30, 35).next());
945        assert_eq!(None, lapper.seek(30, 35, &mut cursor).next());
946        assert_eq!(lapper.find(30, 35).count(), lapper.count(30, 35));
947    }
948
949    // Test that a query that overlaps the start of an interval returns that interval
950    #[test]
951    fn test_query_overlaps_interval_start() {
952        let lapper = setup_nonoverlapping();
953        let mut cursor = 0;
954        let expected = Iv {
955            start: 20,
956            stop: 30,
957            val: 0,
958        };
959        assert_eq!(Some(&expected), lapper.find(15, 25).next());
960        assert_eq!(Some(&expected), lapper.seek(15, 25, &mut cursor).next());
961        assert_eq!(lapper.find(15, 25).count(), lapper.count(15, 25));
962    }
963
964    // Test that a query that overlaps the stop of an interval returns that interval
965    #[test]
966    fn test_query_overlaps_interval_stop() {
967        let lapper = setup_nonoverlapping();
968        let mut cursor = 0;
969        let expected = Iv {
970            start: 20,
971            stop: 30,
972            val: 0,
973        };
974        assert_eq!(Some(&expected), lapper.find(25, 35).next());
975        assert_eq!(Some(&expected), lapper.seek(25, 35, &mut cursor).next());
976        assert_eq!(lapper.find(25, 35).count(), lapper.count(25, 35));
977    }
978
979    // Test that a query that is enveloped by interval returns interval
980    #[test]
981    fn test_interval_envelops_query() {
982        let lapper = setup_nonoverlapping();
983        let mut cursor = 0;
984        let expected = Iv {
985            start: 20,
986            stop: 30,
987            val: 0,
988        };
989        assert_eq!(Some(&expected), lapper.find(22, 27).next());
990        assert_eq!(Some(&expected), lapper.seek(22, 27, &mut cursor).next());
991        assert_eq!(lapper.find(22, 27).count(), lapper.count(22, 27));
992    }
993
994    // Test that a query that envolops an interval returns that interval
995    #[test]
996    fn test_query_envolops_interval() {
997        let lapper = setup_nonoverlapping();
998        let mut cursor = 0;
999        let expected = Iv {
1000            start: 20,
1001            stop: 30,
1002            val: 0,
1003        };
1004        assert_eq!(Some(&expected), lapper.find(15, 35).next());
1005        assert_eq!(Some(&expected), lapper.seek(15, 35, &mut cursor).next());
1006        assert_eq!(lapper.find(15, 35).count(), lapper.count(15, 35));
1007    }
1008
1009    #[test]
1010    fn test_overlapping_intervals() {
1011        let lapper = setup_overlapping();
1012        let mut cursor = 0;
1013        let e1 = Iv {
1014            start: 0,
1015            stop: 15,
1016            val: 0,
1017        };
1018        let e2 = Iv {
1019            start: 10,
1020            stop: 25,
1021            val: 0,
1022        };
1023        assert_eq!(vec![&e1, &e2], lapper.find(8, 20).collect::<Vec<&Iv>>());
1024        assert_eq!(
1025            vec![&e1, &e2],
1026            lapper.seek(8, 20, &mut cursor).collect::<Vec<&Iv>>()
1027        );
1028        assert_eq!(lapper.count(8, 20), 2);
1029    }
1030
1031    #[test]
1032    fn test_merge_overlaps() {
1033        let mut lapper = setup_badlapper();
1034        let expected: Vec<&Iv> = vec![
1035            &Iv{start: 10, stop: 16, val: 0},
1036            &Iv{start: 40, stop: 45, val: 0},
1037            &Iv{start: 50, stop: 55, val: 0},
1038            &Iv{start: 60, stop: 65, val: 0},
1039            &Iv{start: 68, stop: 120, val: 0}, // max_len = 50
1040        ];
1041        assert_eq!(lapper.intervals.len(), lapper.starts.len());
1042        lapper.merge_overlaps();
1043        assert_eq!(expected, lapper.iter().collect::<Vec<&Iv>>());
1044        assert_eq!(lapper.intervals.len(), lapper.starts.len())
1045
1046    }
1047
1048    // This test was added because this breakage was found in a library user's code, where after
1049    // calling merge_overlaps(), the find() call returned an empty iterator.
1050    #[test]
1051    fn test_merge_overlaps_find() {
1052        let data = vec![
1053                Iv{start: 2, stop: 3, val: 0},
1054                Iv{start: 3, stop: 4, val: 0},
1055                Iv{start: 4, stop: 6, val: 0},
1056                Iv{start: 6, stop: 7, val: 0},
1057                Iv{start: 7, stop: 8, val: 0},
1058        ];
1059        let mut lapper = Lapper::new(data);
1060
1061        let found = lapper.find(7, 9).collect::<Vec<&Interval<_,_>>>();
1062        assert_eq!(found, vec![
1063            &Iv{start:7, stop: 8, val: 0},
1064        ]);
1065
1066        // merge_overlaps should merge all intervals to one, which should be returned in the find call.
1067        lapper.merge_overlaps();
1068
1069        let found = lapper.find(7, 9).collect::<Vec<&Interval<_,_>>>();
1070        assert_eq!(found, vec![
1071            &Iv{start:2, stop: 8, val: 0},
1072        ]);
1073    }
1074
1075    #[test]
1076    fn test_lapper_cov() {
1077        let mut lapper = setup_badlapper();
1078        let before = lapper.cov();
1079        lapper.merge_overlaps();
1080        let after = lapper.cov();
1081        assert_eq!(before, after);
1082
1083        let mut lapper = setup_nonoverlapping();
1084        lapper.set_cov();
1085        assert_eq!(lapper.cov(), 50);
1086    }
1087
1088    #[test]
1089    fn test_interval_intersects() {
1090        let i1 = Iv{start: 70, stop: 120, val: 0}; // max_len = 50
1091        let i2 = Iv{start: 10, stop: 15, val: 0};
1092        let i3 = Iv{start: 10, stop: 15, val: 0}; // exact overlap
1093        let i4 = Iv{start: 12, stop: 15, val: 0}; // inner overlap
1094        let i5 = Iv{start: 14, stop: 16, val: 0}; // overlap end
1095        let i6 = Iv{start: 40, stop: 50, val: 0};
1096        let i7 = Iv{start: 50, stop: 55, val: 0};
1097        let i_8 = Iv{start: 60, stop: 65, val: 0};
1098        let i9 = Iv{start: 68, stop: 71, val: 0}; // overlap start
1099        let i10 = Iv{start: 70, stop: 75, val: 0};
1100
1101        assert_eq!(i2.intersect(&i3), 5); // exact match
1102        assert_eq!(i2.intersect(&i4), 3); // inner intersect
1103        assert_eq!(i2.intersect(&i5), 1); // end intersect
1104        assert_eq!(i9.intersect(&i10), 1); // start intersect
1105        assert_eq!(i7.intersect(&i_8), 0); // no intersect
1106        assert_eq!(i6.intersect(&i7), 0); // no intersect stop = start
1107        assert_eq!(i1.intersect(&i10), 5); // inner intersect at start
1108    }
1109
1110    #[test]
1111    fn test_union_and_intersect() {
1112        let data1: Vec<Iv> = vec![
1113            Iv{start: 70, stop: 120, val: 0}, // max_len = 50
1114            Iv{start: 10, stop: 15, val: 0}, // exact overlap
1115            Iv{start: 12, stop: 15, val: 0}, // inner overlap
1116            Iv{start: 14, stop: 16, val: 0}, // overlap end
1117            Iv{start: 68, stop: 71, val: 0}, // overlap start
1118        ];
1119        let data2: Vec<Iv> = vec![
1120
1121            Iv{start: 10, stop: 15, val: 0},
1122            Iv{start: 40, stop: 45, val: 0},
1123            Iv{start: 50, stop: 55, val: 0},
1124            Iv{start: 60, stop: 65, val: 0},
1125            Iv{start: 70, stop: 75, val: 0},
1126        ];
1127
1128        let (mut lapper1, mut lapper2) = (Lapper::new(data1), Lapper::new(data2)) ;
1129        // Should be the same either way it's calculated
1130        let (union, intersect) = lapper1.union_and_intersect(&lapper2);
1131        assert_eq!(intersect, 10);
1132        assert_eq!(union, 73);
1133        let (union, intersect) = lapper2.union_and_intersect(&lapper1);
1134        assert_eq!(intersect, 10);
1135        assert_eq!(union, 73);
1136        lapper1.merge_overlaps();
1137        lapper1.set_cov();
1138        lapper2.merge_overlaps();
1139        lapper2.set_cov();
1140
1141        // Should be the same either way it's calculated
1142        let (union, intersect) = lapper1.union_and_intersect(&lapper2);
1143        assert_eq!(intersect, 10);
1144        assert_eq!(union, 73);
1145        let (union, intersect) = lapper2.union_and_intersect(&lapper1);
1146        assert_eq!(intersect, 10);
1147        assert_eq!(union, 73);
1148    }
1149
1150    #[test]
1151    fn test_find_overlaps_in_large_intervals() {
1152        let data1: Vec<Iv> = vec![
1153            Iv{start: 0, stop: 8, val: 0},
1154            Iv{start: 1, stop: 10, val: 0},
1155            Iv{start: 2, stop: 5, val: 0},
1156            Iv{start: 3, stop: 8, val: 0},
1157            Iv{start: 4, stop: 7, val: 0},
1158            Iv{start: 5, stop: 8, val: 0},
1159            Iv{start: 8, stop: 8, val: 0},
1160            Iv{start: 9, stop: 11, val: 0},
1161            Iv{start: 10, stop: 13, val: 0},
1162            Iv{start: 100, stop: 200, val: 0},
1163            Iv{start: 110, stop: 120, val: 0},
1164            Iv{start: 110, stop: 124, val: 0},
1165            Iv{start: 111, stop: 160, val: 0},
1166            Iv{start: 150, stop: 200, val: 0},
1167        ];
1168        let lapper = Lapper::new(data1);
1169        let found = lapper.find(8, 11).collect::<Vec<&Iv>>();
1170        assert_eq!(found, vec![
1171            &Iv{start: 1, stop: 10, val: 0},
1172            &Iv{start: 9, stop: 11, val: 0},
1173            &Iv{start: 10, stop: 13, val: 0},
1174        ]);
1175        assert_eq!(lapper.count(8, 11), 3);
1176        let found = lapper.find(145, 151).collect::<Vec<&Iv>>();
1177        assert_eq!(found, vec![
1178            &Iv{start: 100, stop: 200, val: 0},
1179            &Iv{start: 111, stop: 160, val: 0},
1180            &Iv{start: 150, stop: 200, val: 0},
1181        ]);
1182
1183        assert_eq!(lapper.count(145, 151), 3);
1184    }
1185
1186    #[test]
1187    fn test_depth_sanity() {
1188        let data1: Vec<Iv> = vec![
1189            Iv{start: 0, stop: 10, val: 0},
1190            Iv{start: 5, stop: 10, val: 0}
1191        ];
1192        let lapper = Lapper::new(data1);
1193        let found = lapper.depth().collect::<Vec<Interval<usize, usize>>>();
1194        assert_eq!(found, vec![
1195                   Interval{start: 0, stop: 5, val: 1},
1196                   Interval{start: 5, stop: 10, val: 2}
1197        ]);
1198    }
1199
1200    #[test]
1201    fn test_depth_hard() {
1202        let data1: Vec<Iv> = vec![
1203            Iv{start: 1, stop: 10, val: 0},
1204            Iv{start: 2, stop: 5, val: 0},
1205            Iv{start: 3, stop: 8, val: 0},
1206            Iv{start: 3, stop: 8, val: 0},
1207            Iv{start: 3, stop: 8, val: 0},
1208            Iv{start: 5, stop: 8, val: 0},
1209            Iv{start: 9, stop: 11, val: 0},
1210        ];
1211        let lapper = Lapper::new(data1);
1212        let found = lapper.depth().collect::<Vec<Interval<usize, usize>>>();
1213        assert_eq!(found, vec![
1214                   Interval{start: 1, stop: 2, val: 1},
1215                   Interval{start: 2, stop: 3, val: 2},
1216                   Interval{start: 3, stop: 8, val: 5},
1217                   Interval{start: 8, stop: 9, val: 1},
1218                   Interval{start: 9, stop: 10, val: 2},
1219                   Interval{start: 10, stop: 11, val: 1},
1220        ]);
1221    }
1222    #[test]
1223    fn test_depth_harder() {
1224        let data1: Vec<Iv> = vec![
1225            Iv{start: 1, stop: 10, val: 0},
1226            Iv{start: 2, stop: 5, val: 0},
1227            Iv{start: 3, stop: 8, val: 0},
1228            Iv{start: 3, stop: 8, val: 0},
1229            Iv{start: 3, stop: 8, val: 0},
1230            Iv{start: 5, stop: 8, val: 0},
1231            Iv{start: 9, stop: 11, val: 0},
1232            Iv{start: 15, stop: 20, val: 0},
1233        ];
1234        let lapper = Lapper::new(data1);
1235        let found = lapper.depth().collect::<Vec<Interval<usize, usize>>>();
1236        assert_eq!(found, vec![
1237                   Interval{start: 1, stop: 2, val: 1},
1238                   Interval{start: 2, stop: 3, val: 2},
1239                   Interval{start: 3, stop: 8, val: 5},
1240                   Interval{start: 8, stop: 9, val: 1},
1241                   Interval{start: 9, stop: 10, val: 2},
1242                   Interval{start: 10, stop: 11, val: 1},
1243                   Interval{start: 15, stop: 20, val: 1},
1244        ]);
1245    }
1246    // BUG TESTS - these are tests that came from real life
1247
1248    // Test that it's not possible to induce index out of bounds by pushing the cursor past the end
1249    // of the lapper.
1250    #[test]
1251    fn test_seek_over_len() {
1252        let lapper = setup_nonoverlapping();
1253        let single = setup_single();
1254        let mut cursor: usize = 0;
1255
1256        for interval in lapper.iter() {
1257            for o_interval in single.seek(interval.start, interval.stop, &mut cursor) {
1258                println!("{:#?}", o_interval);
1259            }
1260        }
1261    }
1262
1263    // Test that if lower_bound puts us before the first match, we still return a match
1264    #[test]
1265    fn test_find_over_behind_first_match() {
1266        let lapper = setup_badlapper();
1267        let e1 = Iv {start: 50, stop: 55, val: 0};
1268        let found = lapper.find(50, 55).next();
1269        assert_eq!(found, Some(&e1));
1270        assert_eq!(lapper.find(50, 55).count(), lapper.count(50,55));
1271    }
1272
1273    // When there is a very long interval that spans many little intervals, test that the little
1274    // intevals still get returne properly
1275    #[test]
1276    fn test_bad_skips() {
1277        let data = vec![
1278            Iv{start:25264912, stop: 25264986, val: 0},
1279            Iv{start:27273024, stop: 27273065	, val: 0},
1280            Iv{start:27440273, stop: 27440318	, val: 0},
1281            Iv{start:27488033, stop: 27488125	, val: 0},
1282            Iv{start:27938410, stop: 27938470	, val: 0},
1283            Iv{start:27959118, stop: 27959171	, val: 0},
1284            Iv{start:28866309, stop: 33141404	, val: 0},
1285        ];
1286        let lapper = Lapper::new(data);
1287
1288        let found = lapper.find(28974798, 33141355).collect::<Vec<&Iv>>();
1289        assert_eq!(found, vec![
1290            &Iv{start:28866309, stop: 33141404	, val: 0},
1291        ]);
1292        assert_eq!(lapper.count(28974798, 33141355), 1);
1293    }
1294
1295    #[test]
1296    fn serde_test() {
1297        let data = vec![
1298            Iv{start:25264912, stop: 25264986, val: 0},
1299            Iv{start:27273024, stop: 27273065	, val: 0},
1300            Iv{start:27440273, stop: 27440318	, val: 0},
1301            Iv{start:27488033, stop: 27488125	, val: 0},
1302            Iv{start:27938410, stop: 27938470	, val: 0},
1303            Iv{start:27959118, stop: 27959171	, val: 0},
1304            Iv{start:28866309, stop: 33141404	, val: 0},
1305        ];
1306        let lapper = Lapper::new(data);
1307
1308        let ser = rkyv::to_bytes::<rkyv::rancor::Error>(&lapper).unwrap();
1309        let deser: Lapper<usize, u32> = rkyv::from_bytes::<Lapper<usize, u32>, rkyv::rancor::Error>(&ser).unwrap();
1310
1311        let found = deser.find(28974798, 33141355).collect::<Vec<&Iv>>();
1312        assert_eq!(found, vec![
1313            &Iv{start:28866309, stop: 33141404	, val: 0},
1314        ]);
1315        assert_eq!(deser.count(28974798, 33141355), 1);
1316    }
1317
1318}