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