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() {
354            return 0;
355        }
356        if elems[0] > *key {
357            return 0;
358        }
359        let mut high = elems.len();
360        let mut low = 0;
361
362        while high - low > 1 {
363            let mid = (high + low) / 2;
364            if elems[mid] < *key {
365                low = mid;
366            } else {
367                high = mid;
368            }
369        }
370        high
371    }
372
373    /// Find the union and the intersect of two lapper objects.
374    /// Union: The set of positions found in both lappers
375    /// Intersect: The number of positions where both lappers intersect. Note that a position only
376    /// counts one time, multiple Intervals covering the same position don't add up.
377    /// ``` rust
378    /// use bed_utils::intervaltree::{Lapper, Interval};
379    /// type Iv = Interval<u32, u32>;
380    /// let data1: Vec<Iv> = vec![
381    ///     Iv{start: 70, stop: 120, val: 0}, // max_len = 50
382    ///     Iv{start: 10, stop: 15, val: 0}, // exact overlap
383    ///     Iv{start: 12, stop: 15, val: 0}, // inner overlap
384    ///     Iv{start: 14, stop: 16, val: 0}, // overlap end
385    ///     Iv{start: 68, stop: 71, val: 0}, // overlap start
386    /// ];
387    /// let data2: Vec<Iv> = vec![
388    ///
389    ///     Iv{start: 10, stop: 15, val: 0},
390    ///     Iv{start: 40, stop: 45, val: 0},
391    ///     Iv{start: 50, stop: 55, val: 0},
392    ///     Iv{start: 60, stop: 65, val: 0},
393    ///     Iv{start: 70, stop: 75, val: 0},
394    /// ];
395    ///
396    /// let (mut lapper1, mut lapper2) = (Lapper::new(data1), Lapper::new(data2)) ;
397    /// // Should be the same either way it's calculated
398    /// let (union, intersect) = lapper1.union_and_intersect(&lapper2);
399    /// assert_eq!(intersect, 10);
400    /// assert_eq!(union, 73);
401    /// let (union, intersect) = lapper2.union_and_intersect(&lapper1);
402    /// assert_eq!(intersect, 10);
403    /// assert_eq!(union, 73);
404    /// lapper1.merge_overlaps();
405    /// lapper1.set_cov();
406    /// lapper2.merge_overlaps();
407    /// lapper2.set_cov();
408    ///
409    /// // Should be the same either way it's calculated
410    /// let (union, intersect) = lapper1.union_and_intersect(&lapper2);
411    /// assert_eq!(intersect, 10);
412    /// assert_eq!(union, 73);
413    /// let (union, intersect) = lapper2.union_and_intersect(&lapper1);
414    /// assert_eq!(intersect, 10);
415    /// assert_eq!(union, 73);
416    /// ```
417    #[inline]
418    pub fn union_and_intersect(&self, other: &Self) -> (I, I) {
419        let mut cursor: usize = 0;
420
421        if !self.overlaps_merged || !other.overlaps_merged {
422            let mut intersections: Vec<Interval<I, bool>> = vec![];
423            for self_iv in self.iter() {
424                for other_iv in other.seek(self_iv.start, self_iv.stop, &mut cursor) {
425                    let start = std::cmp::max(self_iv.start, other_iv.start);
426                    let stop = std::cmp::min(self_iv.stop, other_iv.stop);
427                    intersections.push(Interval {
428                        start,
429                        stop,
430                        val: true,
431                    });
432                }
433            }
434            let mut temp_lapper = Lapper::new(intersections);
435            temp_lapper.merge_overlaps();
436            temp_lapper.set_cov();
437            let union = self.cov() + other.cov() - temp_lapper.cov();
438            (union, temp_lapper.cov())
439        } else {
440            let mut intersect = zero::<I>();
441            for c1_iv in self.iter() {
442                for c2_iv in other.seek(c1_iv.start, c1_iv.stop, &mut cursor) {
443                    let local_intersect = c1_iv.intersect(c2_iv);
444                    intersect = intersect + local_intersect;
445                }
446            }
447            let union = self.cov() + other.cov() - intersect;
448            (union, intersect)
449        }
450    }
451
452    /// Find the intersect of two lapper objects.
453    /// Intersect: The number of positions where both lappers intersect. Note that a position only
454    /// counts one time, multiple Intervals covering the same position don't add up
455    #[inline]
456    pub fn intersect(&self, other: &Self) -> I {
457        self.union_and_intersect(other).1
458    }
459
460    /// Find the union of two lapper objects.
461    #[inline]
462    pub fn union(&self, other: &Self) -> I {
463        self.union_and_intersect(other).0
464    }
465
466    /// Return the contiguous intervals of coverage, `val` represents the number of intervals
467    /// covering the returned interval.
468    ///
469    /// # Examples
470    /// ```
471    /// use bed_utils::intervaltree::{Lapper, Interval};
472    /// let data = (0..20).step_by(5)
473    ///                   .map(|x| Interval{start: x, stop: x + 10, val: true})
474    ///                   .collect::<Vec<Interval<usize, bool>>>();
475    /// let lapper = Lapper::new(data);
476    /// assert_eq!(lapper.depth().collect::<Vec<Interval<usize, usize>>>(), vec![
477    ///             Interval { start: 0, stop: 5, val: 1 },
478    ///             Interval { start: 5, stop: 20, val: 2 },
479    ///             Interval { start: 20, stop: 25, val: 1 }]);
480    /// ```
481    #[inline]
482    pub fn depth(&self) -> IterDepth<I, T> {
483        let mut merged_lapper = Lapper::new(
484            self.intervals
485                .iter()
486                .map(|i| Interval {
487                    start: i.start,
488                    stop: i.stop,
489                    val: true,
490                })
491                .collect::<Vec<Interval<I, bool>>>(),
492        );
493        merged_lapper.merge_overlaps();
494        let merged_len = merged_lapper.intervals.len();
495        IterDepth {
496            inner: self,
497            merged: merged_lapper,
498            curr_merged_pos: zero::<I>(),
499            curr_pos: 0,
500            cursor: 0,
501            end: merged_len,
502        }
503    }
504
505    /// Count all intervals that overlap start .. stop. This performs two binary search in order to
506    /// find all the excluded elements, and then deduces the intersection from there. See
507    /// [BITS](https://arxiv.org/pdf/1208.3407.pdf) for more details.
508    /// ```
509    /// use bed_utils::intervaltree::{Lapper, Interval};
510    /// let lapper = Lapper::new((0..100).step_by(5)
511    ///                                 .map(|x| Interval{start: x, stop: x+2 , val: true})
512    ///                                 .collect::<Vec<Interval<usize, bool>>>());
513    /// assert_eq!(lapper.count(5, 11), 2);
514    /// ```
515    #[inline]
516    pub fn count(&self, start: I, stop: I) -> usize {
517        let len = self.intervals.len();
518        let mut first = Self::bsearch_seq(start, &self.stops);
519        let last = Self::bsearch_seq(stop, &self.starts);
520        //println!("{}/{}", start, stop);
521        //println!("pre start found in stops: {}: {}", first, self.stops[first]);
522        //println!("pre stop found in starts: {}", last);
523        //while last < len && self.starts[last] == stop {
524        //last += 1;
525        //}
526        while first < len && self.stops[first] == start {
527            first += 1;
528        }
529        let num_cant_after = len - last;
530        len - first - num_cant_after
531        //println!("{:#?}", self.starts);
532        //println!("{:#?}", self.stops);
533        //println!("start found in stops: {}", first);
534        //println!("stop found in starts: {}", last);
535    }
536
537    /// Find all intervals that overlap start .. stop
538    /// ```
539    /// use bed_utils::intervaltree::{Lapper, Interval};
540    /// let lapper = Lapper::new((0..100).step_by(5)
541    ///                                 .map(|x| Interval{start: x, stop: x+2 , val: true})
542    ///                                 .collect::<Vec<Interval<usize, bool>>>());
543    /// assert_eq!(lapper.find(5, 11).count(), 2);
544    /// ```
545    #[inline]
546    pub fn find(&self, start: I, stop: I) -> IterFind<I, T> {
547        IterFind {
548            inner: self,
549            off: Self::lower_bound(
550                start.checked_sub(&self.max_len).unwrap_or_else(zero::<I>),
551                &self.intervals,
552            ),
553            start,
554            stop,
555        }
556    }
557
558    /// Find all intevals that overlap start .. stop. This method will work when queries
559    /// to this lapper are in sorted (start) order. It uses a linear search from the last query
560    /// instead of a binary search. A reference to a cursor must be passed in. This reference will
561    /// be modified and should be reused in the next query. This allows seek to not need to make
562    /// the lapper object mutable, and thus use the same lapper accross threads.
563    /// ```
564    /// use bed_utils::intervaltree::{Lapper, Interval};
565    /// let lapper = Lapper::new((0..100).step_by(5)
566    ///                                 .map(|x| Interval{start: x, stop: x+2 , val: true})
567    ///                                 .collect::<Vec<Interval<usize, bool>>>());
568    /// let mut cursor = 0;
569    /// for i in lapper.iter() {
570    ///    assert_eq!(lapper.seek(i.start, i.stop, &mut cursor).count(), 1);
571    /// }
572    /// ```
573    #[inline]
574    pub fn seek<'a>(&'a self, start: I, stop: I, cursor: &mut usize) -> IterFind<'a, I, T> {
575        if *cursor == 0 || (*cursor < self.intervals.len() && self.intervals[*cursor].start > start)
576        {
577            *cursor = Self::lower_bound(
578                start.checked_sub(&self.max_len).unwrap_or_else(zero::<I>),
579                &self.intervals,
580            );
581        }
582
583        while *cursor + 1 < self.intervals.len()
584            && self.intervals[*cursor + 1].start
585                < start.checked_sub(&self.max_len).unwrap_or_else(zero::<I>)
586        {
587            *cursor += 1;
588        }
589
590        IterFind {
591            inner: self,
592            off: *cursor,
593            start,
594            stop,
595        }
596    }
597}
598
599impl<I: PrimInt, T: Clone> Lapper<I, T> {
600    /// Merge any intervals that overlap with eachother within the Lapper. This is an easy way to
601    /// speed up queries.
602    pub fn merge_overlaps(&mut self) {
603        let mut stack: VecDeque<&mut Interval<I, T>> = VecDeque::new();
604        let mut ivs = self.intervals.iter_mut();
605        if let Some(first) = ivs.next() {
606            stack.push_back(first);
607            for interval in ivs {
608                let top = stack.pop_back().unwrap();
609                if top.stop < interval.start {
610                    stack.push_back(top);
611                    stack.push_back(interval);
612                } else if top.stop < interval.stop {
613                    top.stop = interval.stop;
614                    //stack.pop_back();
615                    stack.push_back(top);
616                } else {
617                    // they were equal
618                    stack.push_back(top);
619                }
620            }
621            self.overlaps_merged = true;
622            self.intervals = stack
623                .into_iter()
624                .map(|x| Interval {
625                    start: x.start,
626                    stop: x.stop,
627                    val: x.val.clone(),
628                })
629                .collect();
630        }
631        // Fix the starts and stops used by counts
632        let (mut starts, mut stops): (Vec<_>, Vec<_>) =
633            self.intervals.iter().map(|x| (x.start, x.stop)).unzip();
634        starts.sort();
635        stops.sort();
636        self.starts = starts;
637        self.stops = stops;
638        self.max_len = self
639            .intervals
640            .iter()
641            .map(|x| x.stop.checked_sub(&x.start).unwrap_or_else(zero::<I>))
642            .max()
643            .unwrap_or_else(zero::<I>);
644    }
645}
646
647/// Find Iterator
648#[derive(Debug)]
649pub struct IterFind<'a, I, T>
650{
651    inner: &'a Lapper<I, T>,
652    off: usize,
653    start: I,
654    stop: I,
655}
656
657impl<'a, I: PrimInt, T> Iterator for IterFind<'a, I, T>
658{
659    type Item = &'a Interval<I, T>;
660
661    #[inline]
662    // interval.start < stop && interval.stop > start
663    fn next(&mut self) -> Option<Self::Item> {
664        while self.off < self.inner.intervals.len() {
665            //let mut generator = self.inner.intervals[self.off..].iter();
666            //while let Some(interval) = generator.next() {
667            let interval = &self.inner.intervals[self.off];
668            self.off += 1;
669            if interval.overlap(self.start, self.stop) {
670                return Some(interval);
671            } else if interval.start >= self.stop {
672                break;
673            }
674        }
675        None
676    }
677}
678
679/// Depth Iterator
680#[derive(Debug)]
681pub struct IterDepth<'a, I, T>
682{
683    inner: &'a Lapper<I, T>,
684    merged: Lapper<I, bool>, // A lapper that is the merged_lapper of inner
685    curr_merged_pos: I,      // Current start position in current interval
686    curr_pos: usize,         // In merged list of non-overlapping intervals
687    cursor: usize,           // cursor for seek over inner lapper
688    end: usize,              // len of merged
689}
690
691impl<'a, I: PrimInt, T: Clone> Iterator for IterDepth<'a, I, T>
692{
693    type Item = Interval<I, I>;
694
695    #[inline]
696    fn next(&mut self) -> Option<Self::Item> {
697        let mut interval: &Interval<I, bool> = &self.merged.intervals[self.curr_pos];
698        if self.curr_merged_pos == zero::<I>() {
699            self.curr_merged_pos = interval.start;
700        }
701        if interval.stop == self.curr_merged_pos {
702            if self.curr_pos + 1 != self.end {
703                self.curr_pos += 1;
704                interval = &self.merged.intervals[self.curr_pos];
705                self.curr_merged_pos = interval.start;
706            } else {
707                return None;
708            }
709        }
710        let start = self.curr_merged_pos;
711        let depth_at_point = self
712            .inner
713            .seek(
714                self.curr_merged_pos,
715                self.curr_merged_pos + one::<I>(),
716                &mut self.cursor,
717            )
718            .count();
719        let mut new_depth_at_point = depth_at_point;
720        while new_depth_at_point == depth_at_point && self.curr_merged_pos < interval.stop {
721            self.curr_merged_pos = self.curr_merged_pos + one::<I>();
722            new_depth_at_point = self
723                .inner
724                .seek(
725                    self.curr_merged_pos,
726                    self.curr_merged_pos + one::<I>(),
727                    &mut self.cursor,
728                )
729                .count();
730        }
731        Some(Interval {
732            start,
733            stop: self.curr_merged_pos,
734            val: I::from(depth_at_point).unwrap(), // from usize should always work
735        })
736    }
737}
738/// Lapper Iterator
739pub struct IterLapper<'a, I, T>
740{
741    inner: &'a Lapper<I, T>,
742    pos: usize,
743}
744
745impl<'a, I, T> Iterator for IterLapper<'a, I, T>
746{
747    type Item = &'a Interval<I, T>;
748
749    fn next(&mut self) -> Option<Self::Item> {
750        if self.pos >= self.inner.intervals.len() {
751            None
752        } else {
753            self.pos += 1;
754            self.inner.intervals.get(self.pos - 1)
755        }
756    }
757}
758
759impl<I, T> IntoIterator for Lapper<I, T>
760{
761    type Item = Interval<I, T>;
762    type IntoIter = ::std::vec::IntoIter<Self::Item>;
763
764    fn into_iter(self) -> Self::IntoIter {
765        self.intervals.into_iter()
766    }
767}
768
769impl<'a, I, T> IntoIterator for &'a Lapper<I, T>
770{
771    type Item = &'a Interval<I, T>;
772    type IntoIter = std::slice::Iter<'a, Interval<I, T>>;
773
774    fn into_iter(self) -> std::slice::Iter<'a, Interval<I, T>> {
775        self.intervals.iter()
776    }
777}
778
779impl<'a, I, T> IntoIterator for &'a mut Lapper<I, T>
780{
781    type Item = &'a mut Interval<I, T>;
782    type IntoIter = std::slice::IterMut<'a, Interval<I, T>>;
783
784    fn into_iter(self) -> std::slice::IterMut<'a, Interval<I, T>> {
785        self.intervals.iter_mut()
786    }
787}
788
789#[cfg(test)]
790#[rustfmt::skip]
791mod tests {
792    use super::*;
793
794    type Iv = Interval<usize, u32>;
795    fn setup_nonoverlapping() -> Lapper<usize, u32> {
796        let data: Vec<Iv> = (0..100)
797            .step_by(20)
798            .map(|x| Iv {
799                start: x,
800                stop: x + 10,
801                val: 0,
802            })
803            .collect();
804        Lapper::new(data)
805    }
806
807    fn setup_overlapping() -> Lapper<usize, u32> {
808        let data: Vec<Iv> = (0..100)
809            .step_by(10)
810            .map(|x| Iv {
811                start: x,
812                stop: x + 15,
813                val: 0,
814            })
815            .collect();
816        Lapper::new(data)
817    }
818
819    fn setup_badlapper() -> Lapper<usize, u32> {
820        let data: Vec<Iv> = vec![
821            Iv{start: 70, stop: 120, val: 0}, // max_len = 50
822            Iv{start: 10, stop: 15, val: 0},
823            Iv{start: 10, stop: 15, val: 0}, // exact overlap
824            Iv{start: 12, stop: 15, val: 0}, // inner overlap
825            Iv{start: 14, stop: 16, val: 0}, // overlap end
826            Iv{start: 40, stop: 45, val: 0},
827            Iv{start: 50, stop: 55, val: 0},
828            Iv{start: 60, stop: 65, val: 0},
829            Iv{start: 68, stop: 71, val: 0}, // overlap start
830            Iv{start: 70, stop: 75, val: 0},
831        ];
832        Lapper::new(data)
833    }
834
835    fn setup_single() -> Lapper<usize, u32> {
836        let data: Vec<Iv> = vec![Iv {
837            start: 10,
838            stop: 35,
839            val: 0,
840        }];
841        Lapper::new(data)
842    }
843
844    // Test that inserting data ends up with the same lapper (nonoverlapping)
845    #[test]
846    fn insert_equality_nonoverlapping() {
847        let data: Vec<Iv> = (0..100)
848            .step_by(20)
849            .map(|x| Iv {
850                start: x,
851                stop: x + 10,
852                val: 0,
853            })
854            .collect();
855        let new_lapper = Lapper::new(data.clone());
856        let mut insert_lapper = Lapper::new(vec![]);
857        for elem in data {
858            insert_lapper.insert(elem);
859        }
860        assert_eq!(new_lapper.starts, insert_lapper.starts);
861        assert_eq!(new_lapper.stops, insert_lapper.stops);
862        assert_eq!(new_lapper.intervals, insert_lapper.intervals);
863        assert_eq!(new_lapper.max_len, insert_lapper.max_len);
864    }
865
866    // Test that inserting data ends up with the same lapper (overlapping)
867    #[test]
868    fn insert_equality_overlapping() {
869        let data: Vec<Iv> = (0..100)
870            .step_by(10)
871            .map(|x| Iv {
872                start: x,
873                stop: x + 15,
874                val: 0,
875            })
876            .collect();
877        let new_lapper = Lapper::new(data.clone());
878        let mut insert_lapper = Lapper::new(vec![]);
879        for elem in data {
880            insert_lapper.insert(elem);
881        }
882        assert_eq!(new_lapper.starts, insert_lapper.starts);
883        assert_eq!(new_lapper.stops, insert_lapper.stops);
884        assert_eq!(new_lapper.intervals, insert_lapper.intervals);
885        assert_eq!(new_lapper.max_len, insert_lapper.max_len);
886    }
887
888    // Test that inserting data half with new and half with insert
889    // ends up with the same lapper
890    #[test]
891    fn insert_equality_half_and_half() {
892        let data: Vec<Iv> = (0..100)
893            .step_by(1)
894            .map(|x| Iv {
895                start: x,
896                stop: x + 15,
897                val: 0,
898            })
899            .collect();
900        let new_lapper = Lapper::new(data.clone());
901        let (new_data, insert_data) = data.split_at(50);
902        let mut insert_lapper = Lapper::new(new_data.to_vec());
903        let mut insert_data = insert_data.to_vec();
904        insert_data.reverse();
905        for elem in insert_data {
906            insert_lapper.insert(elem);
907        }
908        assert_eq!(new_lapper.starts, insert_lapper.starts);
909        assert_eq!(new_lapper.stops, insert_lapper.stops);
910        assert_eq!(new_lapper.intervals, insert_lapper.intervals);
911        assert_eq!(new_lapper.max_len, insert_lapper.max_len);
912    }
913
914    // Test that inserting data ends up with the same lapper (badlapper)
915    #[test]
916    fn insert_equality_badlapper() {
917        let data: Vec<Iv> = vec![
918            Iv{start: 70, stop: 120, val: 0}, // max_len = 50
919            Iv{start: 10, stop: 15, val: 0},
920            Iv{start: 10, stop: 15, val: 0}, // exact overlap
921            Iv{start: 12, stop: 15, val: 0}, // inner overlap
922            Iv{start: 14, stop: 16, val: 0}, // overlap end
923            Iv{start: 40, stop: 45, val: 0},
924            Iv{start: 50, stop: 55, val: 0},
925            Iv{start: 60, stop: 65, val: 0},
926            Iv{start: 68, stop: 71, val: 0}, // overlap start
927            Iv{start: 70, stop: 75, val: 0},
928        ];
929        let new_lapper = Lapper::new(data.clone());
930        let mut insert_lapper = Lapper::new(vec![]);
931        for elem in data {
932            insert_lapper.insert(elem);
933        }
934        assert_eq!(new_lapper.starts, insert_lapper.starts);
935        assert_eq!(new_lapper.stops, insert_lapper.stops);
936        assert_eq!(new_lapper.intervals, insert_lapper.intervals);
937        assert_eq!(new_lapper.max_len, insert_lapper.max_len);
938    }
939
940    // Test that inserting data ends up with the same lapper (single)
941    #[test]
942    fn insert_equality_single() {
943        let data: Vec<Iv> = vec![Iv {
944            start: 10,
945            stop: 35,
946            val: 0,
947        }];
948        let new_lapper = Lapper::new(data.clone());
949        let mut insert_lapper = Lapper::new(vec![]);
950        for elem in data {
951            insert_lapper.insert(elem);
952        }
953        assert_eq!(new_lapper.starts, insert_lapper.starts);
954        assert_eq!(new_lapper.stops, insert_lapper.stops);
955        assert_eq!(new_lapper.intervals, insert_lapper.intervals);
956        assert_eq!(new_lapper.max_len, insert_lapper.max_len);
957    }
958
959    // Test that a query stop that hits an interval start returns no interval
960    #[test]
961    fn test_query_stop_interval_start() {
962        let lapper = setup_nonoverlapping();
963        let mut cursor = 0;
964        assert_eq!(None, lapper.find(15, 20).next());
965        assert_eq!(None, lapper.seek(15, 20, &mut cursor).next());
966        assert_eq!(lapper.find(15, 20).count(), lapper.count(15, 20));
967    }
968
969    // Test that a query start that hits an interval end returns no interval
970    #[test]
971    fn test_query_start_interval_stop() {
972        let lapper = setup_nonoverlapping();
973        let mut cursor = 0;
974        assert_eq!(None, lapper.find(30, 35).next());
975        assert_eq!(None, lapper.seek(30, 35, &mut cursor).next());
976        assert_eq!(lapper.find(30, 35).count(), lapper.count(30, 35));
977    }
978
979    // Test that a query that overlaps the start of an interval returns that interval
980    #[test]
981    fn test_query_overlaps_interval_start() {
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(15, 25).next());
990        assert_eq!(Some(&expected), lapper.seek(15, 25, &mut cursor).next());
991        assert_eq!(lapper.find(15, 25).count(), lapper.count(15, 25));
992    }
993
994    // Test that a query that overlaps the stop of an interval returns that interval
995    #[test]
996    fn test_query_overlaps_interval_stop() {
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(25, 35).next());
1005        assert_eq!(Some(&expected), lapper.seek(25, 35, &mut cursor).next());
1006        assert_eq!(lapper.find(25, 35).count(), lapper.count(25, 35));
1007    }
1008
1009    // Test that a query that is enveloped by interval returns interval
1010    #[test]
1011    fn test_interval_envelops_query() {
1012        let lapper = setup_nonoverlapping();
1013        let mut cursor = 0;
1014        let expected = Iv {
1015            start: 20,
1016            stop: 30,
1017            val: 0,
1018        };
1019        assert_eq!(Some(&expected), lapper.find(22, 27).next());
1020        assert_eq!(Some(&expected), lapper.seek(22, 27, &mut cursor).next());
1021        assert_eq!(lapper.find(22, 27).count(), lapper.count(22, 27));
1022    }
1023
1024    // Test that a query that envolops an interval returns that interval
1025    #[test]
1026    fn test_query_envolops_interval() {
1027        let lapper = setup_nonoverlapping();
1028        let mut cursor = 0;
1029        let expected = Iv {
1030            start: 20,
1031            stop: 30,
1032            val: 0,
1033        };
1034        assert_eq!(Some(&expected), lapper.find(15, 35).next());
1035        assert_eq!(Some(&expected), lapper.seek(15, 35, &mut cursor).next());
1036        assert_eq!(lapper.find(15, 35).count(), lapper.count(15, 35));
1037    }
1038
1039    #[test]
1040    fn test_overlapping_intervals() {
1041        let lapper = setup_overlapping();
1042        let mut cursor = 0;
1043        let e1 = Iv {
1044            start: 0,
1045            stop: 15,
1046            val: 0,
1047        };
1048        let e2 = Iv {
1049            start: 10,
1050            stop: 25,
1051            val: 0,
1052        };
1053        assert_eq!(vec![&e1, &e2], lapper.find(8, 20).collect::<Vec<&Iv>>());
1054        assert_eq!(
1055            vec![&e1, &e2],
1056            lapper.seek(8, 20, &mut cursor).collect::<Vec<&Iv>>()
1057        );
1058        assert_eq!(lapper.count(8, 20), 2);
1059    }
1060
1061    #[test]
1062    fn test_merge_overlaps() {
1063        let mut lapper = setup_badlapper();
1064        let expected: Vec<&Iv> = vec![
1065            &Iv{start: 10, stop: 16, val: 0},
1066            &Iv{start: 40, stop: 45, val: 0},
1067            &Iv{start: 50, stop: 55, val: 0},
1068            &Iv{start: 60, stop: 65, val: 0},
1069            &Iv{start: 68, stop: 120, val: 0}, // max_len = 50
1070        ];
1071        assert_eq!(lapper.intervals.len(), lapper.starts.len());
1072        lapper.merge_overlaps();
1073        assert_eq!(expected, lapper.iter().collect::<Vec<&Iv>>());
1074        assert_eq!(lapper.intervals.len(), lapper.starts.len())
1075
1076    }
1077
1078    // This test was added because this breakage was found in a library user's code, where after
1079    // calling merge_overlaps(), the find() call returned an empty iterator.
1080    #[test]
1081    fn test_merge_overlaps_find() {
1082        let data = vec![
1083                Iv{start: 2, stop: 3, val: 0},
1084                Iv{start: 3, stop: 4, val: 0},
1085                Iv{start: 4, stop: 6, val: 0},
1086                Iv{start: 6, stop: 7, val: 0},
1087                Iv{start: 7, stop: 8, val: 0},
1088        ];
1089        let mut lapper = Lapper::new(data);
1090
1091        let found = lapper.find(7, 9).collect::<Vec<&Interval<_,_>>>();
1092        assert_eq!(found, vec![
1093            &Iv{start:7, stop: 8, val: 0},
1094        ]);
1095
1096        // merge_overlaps should merge all intervals to one, which should be returned in the find call.
1097        lapper.merge_overlaps();
1098
1099        let found = lapper.find(7, 9).collect::<Vec<&Interval<_,_>>>();
1100        assert_eq!(found, vec![
1101            &Iv{start:2, stop: 8, val: 0},
1102        ]);
1103    }
1104
1105    #[test]
1106    fn test_lapper_cov() {
1107        let mut lapper = setup_badlapper();
1108        let before = lapper.cov();
1109        lapper.merge_overlaps();
1110        let after = lapper.cov();
1111        assert_eq!(before, after);
1112
1113        let mut lapper = setup_nonoverlapping();
1114        lapper.set_cov();
1115        assert_eq!(lapper.cov(), 50);
1116    }
1117
1118    #[test]
1119    fn test_interval_intersects() {
1120        let i1 = Iv{start: 70, stop: 120, val: 0}; // max_len = 50
1121        let i2 = Iv{start: 10, stop: 15, val: 0};
1122        let i3 = Iv{start: 10, stop: 15, val: 0}; // exact overlap
1123        let i4 = Iv{start: 12, stop: 15, val: 0}; // inner overlap
1124        let i5 = Iv{start: 14, stop: 16, val: 0}; // overlap end
1125        let i6 = Iv{start: 40, stop: 50, val: 0};
1126        let i7 = Iv{start: 50, stop: 55, val: 0};
1127        let i_8 = Iv{start: 60, stop: 65, val: 0};
1128        let i9 = Iv{start: 68, stop: 71, val: 0}; // overlap start
1129        let i10 = Iv{start: 70, stop: 75, val: 0};
1130
1131        assert_eq!(i2.intersect(&i3), 5); // exact match
1132        assert_eq!(i2.intersect(&i4), 3); // inner intersect
1133        assert_eq!(i2.intersect(&i5), 1); // end intersect
1134        assert_eq!(i9.intersect(&i10), 1); // start intersect
1135        assert_eq!(i7.intersect(&i_8), 0); // no intersect
1136        assert_eq!(i6.intersect(&i7), 0); // no intersect stop = start
1137        assert_eq!(i1.intersect(&i10), 5); // inner intersect at start
1138    }
1139
1140    #[test]
1141    fn test_union_and_intersect() {
1142        let data1: Vec<Iv> = vec![
1143            Iv{start: 70, stop: 120, val: 0}, // max_len = 50
1144            Iv{start: 10, stop: 15, val: 0}, // exact overlap
1145            Iv{start: 12, stop: 15, val: 0}, // inner overlap
1146            Iv{start: 14, stop: 16, val: 0}, // overlap end
1147            Iv{start: 68, stop: 71, val: 0}, // overlap start
1148        ];
1149        let data2: Vec<Iv> = vec![
1150
1151            Iv{start: 10, stop: 15, val: 0},
1152            Iv{start: 40, stop: 45, val: 0},
1153            Iv{start: 50, stop: 55, val: 0},
1154            Iv{start: 60, stop: 65, val: 0},
1155            Iv{start: 70, stop: 75, val: 0},
1156        ];
1157
1158        let (mut lapper1, mut lapper2) = (Lapper::new(data1), Lapper::new(data2)) ;
1159        // Should be the same either way it's calculated
1160        let (union, intersect) = lapper1.union_and_intersect(&lapper2);
1161        assert_eq!(intersect, 10);
1162        assert_eq!(union, 73);
1163        let (union, intersect) = lapper2.union_and_intersect(&lapper1);
1164        assert_eq!(intersect, 10);
1165        assert_eq!(union, 73);
1166        lapper1.merge_overlaps();
1167        lapper1.set_cov();
1168        lapper2.merge_overlaps();
1169        lapper2.set_cov();
1170
1171        // Should be the same either way it's calculated
1172        let (union, intersect) = lapper1.union_and_intersect(&lapper2);
1173        assert_eq!(intersect, 10);
1174        assert_eq!(union, 73);
1175        let (union, intersect) = lapper2.union_and_intersect(&lapper1);
1176        assert_eq!(intersect, 10);
1177        assert_eq!(union, 73);
1178    }
1179
1180    #[test]
1181    fn test_find_overlaps_in_large_intervals() {
1182        let data1: Vec<Iv> = vec![
1183            Iv{start: 0, stop: 8, val: 0},
1184            Iv{start: 1, stop: 10, val: 0},
1185            Iv{start: 2, stop: 5, val: 0},
1186            Iv{start: 3, stop: 8, val: 0},
1187            Iv{start: 4, stop: 7, val: 0},
1188            Iv{start: 5, stop: 8, val: 0},
1189            Iv{start: 8, stop: 8, val: 0},
1190            Iv{start: 9, stop: 11, val: 0},
1191            Iv{start: 10, stop: 13, val: 0},
1192            Iv{start: 100, stop: 200, val: 0},
1193            Iv{start: 110, stop: 120, val: 0},
1194            Iv{start: 110, stop: 124, val: 0},
1195            Iv{start: 111, stop: 160, val: 0},
1196            Iv{start: 150, stop: 200, val: 0},
1197        ];
1198        let lapper = Lapper::new(data1);
1199        let found = lapper.find(8, 11).collect::<Vec<&Iv>>();
1200        assert_eq!(found, vec![
1201            &Iv{start: 1, stop: 10, val: 0},
1202            &Iv{start: 9, stop: 11, val: 0},
1203            &Iv{start: 10, stop: 13, val: 0},
1204        ]);
1205        assert_eq!(lapper.count(8, 11), 3);
1206        let found = lapper.find(145, 151).collect::<Vec<&Iv>>();
1207        assert_eq!(found, vec![
1208            &Iv{start: 100, stop: 200, val: 0},
1209            &Iv{start: 111, stop: 160, val: 0},
1210            &Iv{start: 150, stop: 200, val: 0},
1211        ]);
1212
1213        assert_eq!(lapper.count(145, 151), 3);
1214    }
1215
1216    #[test]
1217    fn test_depth_sanity() {
1218        let data1: Vec<Iv> = vec![
1219            Iv{start: 0, stop: 10, val: 0},
1220            Iv{start: 5, stop: 10, val: 0}
1221        ];
1222        let lapper = Lapper::new(data1);
1223        let found = lapper.depth().collect::<Vec<Interval<usize, usize>>>();
1224        assert_eq!(found, vec![
1225                   Interval{start: 0, stop: 5, val: 1},
1226                   Interval{start: 5, stop: 10, val: 2}
1227        ]);
1228    }
1229
1230    #[test]
1231    fn test_depth_hard() {
1232        let data1: Vec<Iv> = vec![
1233            Iv{start: 1, stop: 10, val: 0},
1234            Iv{start: 2, stop: 5, val: 0},
1235            Iv{start: 3, stop: 8, val: 0},
1236            Iv{start: 3, stop: 8, val: 0},
1237            Iv{start: 3, stop: 8, val: 0},
1238            Iv{start: 5, stop: 8, val: 0},
1239            Iv{start: 9, stop: 11, val: 0},
1240        ];
1241        let lapper = Lapper::new(data1);
1242        let found = lapper.depth().collect::<Vec<Interval<usize, usize>>>();
1243        assert_eq!(found, vec![
1244                   Interval{start: 1, stop: 2, val: 1},
1245                   Interval{start: 2, stop: 3, val: 2},
1246                   Interval{start: 3, stop: 8, val: 5},
1247                   Interval{start: 8, stop: 9, val: 1},
1248                   Interval{start: 9, stop: 10, val: 2},
1249                   Interval{start: 10, stop: 11, val: 1},
1250        ]);
1251    }
1252    #[test]
1253    fn test_depth_harder() {
1254        let data1: Vec<Iv> = vec![
1255            Iv{start: 1, stop: 10, val: 0},
1256            Iv{start: 2, stop: 5, val: 0},
1257            Iv{start: 3, stop: 8, val: 0},
1258            Iv{start: 3, stop: 8, val: 0},
1259            Iv{start: 3, stop: 8, val: 0},
1260            Iv{start: 5, stop: 8, val: 0},
1261            Iv{start: 9, stop: 11, val: 0},
1262            Iv{start: 15, stop: 20, val: 0},
1263        ];
1264        let lapper = Lapper::new(data1);
1265        let found = lapper.depth().collect::<Vec<Interval<usize, usize>>>();
1266        assert_eq!(found, vec![
1267                   Interval{start: 1, stop: 2, val: 1},
1268                   Interval{start: 2, stop: 3, val: 2},
1269                   Interval{start: 3, stop: 8, val: 5},
1270                   Interval{start: 8, stop: 9, val: 1},
1271                   Interval{start: 9, stop: 10, val: 2},
1272                   Interval{start: 10, stop: 11, val: 1},
1273                   Interval{start: 15, stop: 20, val: 1},
1274        ]);
1275    }
1276    // BUG TESTS - these are tests that came from real life
1277
1278    // Test that it's not possible to induce index out of bounds by pushing the cursor past the end
1279    // of the lapper.
1280    #[test]
1281    fn test_seek_over_len() {
1282        let lapper = setup_nonoverlapping();
1283        let single = setup_single();
1284        let mut cursor: usize = 0;
1285
1286        for interval in lapper.iter() {
1287            for o_interval in single.seek(interval.start, interval.stop, &mut cursor) {
1288                println!("{:#?}", o_interval);
1289            }
1290        }
1291    }
1292
1293    // Test that if lower_bound puts us before the first match, we still return a match
1294    #[test]
1295    fn test_find_over_behind_first_match() {
1296        let lapper = setup_badlapper();
1297        let e1 = Iv {start: 50, stop: 55, val: 0};
1298        let found = lapper.find(50, 55).next();
1299        assert_eq!(found, Some(&e1));
1300        assert_eq!(lapper.find(50, 55).count(), lapper.count(50,55));
1301    }
1302
1303    // When there is a very long interval that spans many little intervals, test that the little
1304    // intevals still get returne properly
1305    #[test]
1306    fn test_bad_skips() {
1307        let data = vec![
1308            Iv{start:25264912, stop: 25264986, val: 0},
1309            Iv{start:27273024, stop: 27273065	, val: 0},
1310            Iv{start:27440273, stop: 27440318	, val: 0},
1311            Iv{start:27488033, stop: 27488125	, val: 0},
1312            Iv{start:27938410, stop: 27938470	, val: 0},
1313            Iv{start:27959118, stop: 27959171	, val: 0},
1314            Iv{start:28866309, stop: 33141404	, val: 0},
1315        ];
1316        let lapper = Lapper::new(data);
1317
1318        let found = lapper.find(28974798, 33141355).collect::<Vec<&Iv>>();
1319        assert_eq!(found, vec![
1320            &Iv{start:28866309, stop: 33141404	, val: 0},
1321        ]);
1322        assert_eq!(lapper.count(28974798, 33141355), 1);
1323    }
1324
1325    #[test]
1326    fn serde_test() {
1327        let data = vec![
1328            Iv{start:25264912, stop: 25264986, val: 0},
1329            Iv{start:27273024, stop: 27273065	, val: 0},
1330            Iv{start:27440273, stop: 27440318	, val: 0},
1331            Iv{start:27488033, stop: 27488125	, val: 0},
1332            Iv{start:27938410, stop: 27938470	, val: 0},
1333            Iv{start:27959118, stop: 27959171	, val: 0},
1334            Iv{start:28866309, stop: 33141404	, val: 0},
1335        ];
1336        let lapper = Lapper::new(data);
1337
1338        let config = bincode::config::standard();
1339        let ser = bincode::encode_to_vec(&lapper, config).unwrap();
1340        let deser: Lapper<usize, u32> = bincode::decode_from_slice(&ser, config).unwrap().0;
1341
1342        let found = deser.find(28974798, 33141355).collect::<Vec<&Iv>>();
1343        assert_eq!(found, vec![
1344            &Iv{start:28866309, stop: 33141404	, val: 0},
1345        ]);
1346        assert_eq!(deser.count(28974798, 33141355), 1);
1347    }
1348
1349}