1use num_traits::{
79 identities::{one, zero},
80 PrimInt,
81};
82use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
83use std::cmp::Ordering::{self};
84use std::collections::VecDeque;
85
86#[derive(Archive, RkyvSerialize, RkyvDeserialize, Debug, Clone)]
89pub struct Interval<I, T> {
90 pub start: I,
91 pub stop: I,
92 pub val: T,
93}
94
95#[derive(Archive, RkyvSerialize, RkyvDeserialize, Debug, Clone)]
98pub struct Lapper<I, T> {
99 pub intervals: Vec<Interval<I, T>>,
101 starts: Vec<I>,
103 stops: Vec<I>,
105 max_len: I,
107 cov: Option<I>,
109 pub overlaps_merged: bool,
111}
112
113impl<I: PrimInt, T> Interval<I, T> {
114 #[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 #[inline]
124 pub fn overlap(&self, start: I, stop: I) -> bool {
125 self.start < stop && self.stop > start
126 }
127}
128
129impl<I: Ord, T> Ord for Interval<I, T> {
130 #[inline]
131 fn cmp(&self, other: &Interval<I, T>) -> Ordering {
132 match self.start.cmp(&other.start) {
133 Ordering::Less => Ordering::Less,
134 Ordering::Greater => Ordering::Greater,
135 Ordering::Equal => self.stop.cmp(&other.stop),
136 }
137 }
138}
139
140impl<I: PartialEq, T> Eq for Interval<I, T> {}
141
142impl<I: Ord, T> PartialOrd for Interval<I, T> {
143 #[inline]
144 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
145 Some(self.cmp(other))
146 }
147}
148
149impl<I: PartialEq, T> PartialEq for Interval<I, T> {
150 #[inline]
151 fn eq(&self, other: &Interval<I, T>) -> bool {
152 self.start == other.start && self.stop == other.stop
153 }
154}
155
156impl<I: PrimInt, T> Lapper<I, T> {
157 pub fn new(mut intervals: Vec<Interval<I, T>>) -> Self {
167 intervals.sort();
168 let (mut starts, mut stops): (Vec<_>, Vec<_>) =
169 intervals.iter().map(|x| (x.start, x.stop)).unzip();
170 starts.sort();
171 stops.sort();
172 let mut max_len = zero::<I>();
173 for interval in intervals.iter() {
174 let i_len = interval
175 .stop
176 .checked_sub(&interval.start)
177 .unwrap_or_else(zero::<I>);
178 if i_len > max_len {
179 max_len = i_len;
180 }
181 }
182 Lapper {
183 intervals,
184 starts,
185 stops,
186 max_len,
187 cov: None,
188 overlaps_merged: false,
189 }
190 }
191
192 pub fn insert(&mut self, elem: Interval<I, T>) {
215 let starts_insert_index = Self::bsearch_seq(elem.start, &self.starts);
216 let stops_insert_index = Self::bsearch_seq(elem.stop, &self.stops);
217 let intervals_insert_index = Self::bsearch_seq_ref(&elem, &self.intervals);
218 let i_len = elem.stop.checked_sub(&elem.start).unwrap_or_else(zero::<I>);
219 if i_len > self.max_len {
220 self.max_len = i_len;
221 }
222 self.starts.insert(starts_insert_index, elem.start);
223 self.stops.insert(stops_insert_index, elem.stop);
224 self.intervals.insert(intervals_insert_index, elem);
225 self.cov = None;
226 self.overlaps_merged = false;
227 }
228
229 #[inline]
239 pub fn len(&self) -> usize {
240 self.intervals.len()
241 }
242
243 #[inline]
251 pub fn is_empty(&self) -> bool {
252 self.intervals.is_empty()
253 }
254
255 #[inline]
265 pub fn cov(&self) -> I {
266 match self.cov {
267 None => self.calculate_coverage(),
268 Some(cov) => cov,
269 }
270 }
271
272 pub fn set_cov(&mut self) -> I {
275 let cov = self.calculate_coverage();
276 self.cov = Some(cov);
277 cov
278 }
279
280 fn calculate_coverage(&self) -> I {
282 let mut moving_interval = Interval {
283 start: zero::<I>(),
284 stop: zero::<I>(),
285 val: zero::<I>(),
286 };
287 let mut cov = zero::<I>();
288
289 for interval in self.intervals.iter() {
290 if moving_interval.overlap(interval.start, interval.stop) {
292 moving_interval.start = std::cmp::min(moving_interval.start, interval.start);
293 moving_interval.stop = std::cmp::max(moving_interval.stop, interval.stop);
294 } else {
295 cov = cov + (moving_interval.stop - moving_interval.start);
297 moving_interval.start = interval.start;
298 moving_interval.stop = interval.stop;
299 }
300 }
301 cov = cov + (moving_interval.stop - moving_interval.start);
303 cov
304 }
305
306 #[inline]
308 pub fn iter(&self) -> IterLapper<'_, I, T> {
309 IterLapper {
310 inner: self,
311 pos: 0,
312 }
313 }
314
315 #[inline]
320 pub fn lower_bound(start: I, intervals: &[Interval<I, T>]) -> usize {
321 let mut size = intervals.len();
322 let mut low = 0;
323
324 while size > 0 {
325 let half = size / 2;
326 let other_half = size - half;
327 let probe = low + half;
328 let other_low = low + other_half;
329 let v = &intervals[probe];
330 size = half;
331 low = if v.start < start { other_low } else { low }
332 }
333 low
334 }
335
336 #[inline]
337 pub fn bsearch_seq<K>(key: K, elems: &[K]) -> usize
338 where
339 K: PartialEq + PartialOrd,
340 {
341 Self::bsearch_seq_ref(&key, elems)
342 }
343
344 #[inline]
345 pub fn bsearch_seq_ref<K>(key: &K, elems: &[K]) -> usize
346 where
347 K: PartialEq + PartialOrd,
348 {
349 if elems.is_empty() || elems[0] >= *key {
350 return 0;
351 } else if elems[elems.len() - 1] < *key {
352 return elems.len();
353 }
354 let mut cursor = 0;
355 let mut length = elems.len();
356 while length > 1 {
357 let half = length >> 1;
358 length -= half;
359 cursor += (usize::from(elems[cursor + half - 1] < *key)) * half;
360 }
361 cursor
362 }
363
364 #[inline]
409 pub fn union_and_intersect(&self, other: &Self) -> (I, I) {
410 let mut cursor: usize = 0;
411
412 if !self.overlaps_merged || !other.overlaps_merged {
413 let mut intersections: Vec<Interval<I, bool>> = vec![];
414 for self_iv in self.iter() {
415 for other_iv in other.seek(self_iv.start, self_iv.stop, &mut cursor) {
416 let start = std::cmp::max(self_iv.start, other_iv.start);
417 let stop = std::cmp::min(self_iv.stop, other_iv.stop);
418 intersections.push(Interval {
419 start,
420 stop,
421 val: true,
422 });
423 }
424 }
425 let mut temp_lapper = Lapper::new(intersections);
426 temp_lapper.merge_overlaps();
427 temp_lapper.set_cov();
428 let union = self.cov() + other.cov() - temp_lapper.cov();
429 (union, temp_lapper.cov())
430 } else {
431 let mut intersect = zero::<I>();
432 for c1_iv in self.iter() {
433 for c2_iv in other.seek(c1_iv.start, c1_iv.stop, &mut cursor) {
434 let local_intersect = c1_iv.intersect(c2_iv);
435 intersect = intersect + local_intersect;
436 }
437 }
438 let union = self.cov() + other.cov() - intersect;
439 (union, intersect)
440 }
441 }
442
443 #[inline]
447 pub fn intersect(&self, other: &Self) -> I {
448 self.union_and_intersect(other).1
449 }
450
451 #[inline]
453 pub fn union(&self, other: &Self) -> I {
454 self.union_and_intersect(other).0
455 }
456
457 #[inline]
473 pub fn depth(&self) -> IterDepth<'_, I, T> {
474 let mut merged_lapper = Lapper::new(
475 self.intervals
476 .iter()
477 .map(|i| Interval {
478 start: i.start,
479 stop: i.stop,
480 val: true,
481 })
482 .collect::<Vec<Interval<I, bool>>>(),
483 );
484 merged_lapper.merge_overlaps();
485 let merged_len = merged_lapper.intervals.len();
486 IterDepth {
487 inner: self,
488 merged: merged_lapper,
489 curr_merged_pos: zero::<I>(),
490 curr_pos: 0,
491 cursor: 0,
492 end: merged_len,
493 }
494 }
495
496 #[inline]
507 pub fn count(&self, start: I, stop: I) -> usize {
508 let len = self.intervals.len();
509 let first = Self::bsearch_seq(start + one::<I>(), &self.stops);
511 let last = Self::bsearch_seq(stop, &self.starts);
512 let num_cant_after = len - last;
513 len - first - num_cant_after
514 }
515
516 #[inline]
525 pub fn find(&self, start: I, stop: I) -> IterFind<'_, I, T> {
526 IterFind {
527 inner: self,
528 off: Self::lower_bound(
529 start.checked_sub(&self.max_len).unwrap_or_else(zero::<I>),
530 &self.intervals,
531 ),
532 start,
533 stop,
534 }
535 }
536
537 #[inline]
553 pub fn seek<'a>(&'a self, start: I, stop: I, cursor: &mut usize) -> IterFind<'a, I, T> {
554 if *cursor == 0 || (*cursor < self.intervals.len() && self.intervals[*cursor].start > start)
555 {
556 *cursor = Self::lower_bound(
557 start.checked_sub(&self.max_len).unwrap_or_else(zero::<I>),
558 &self.intervals,
559 );
560 }
561
562 while *cursor + 1 < self.intervals.len()
563 && self.intervals[*cursor + 1].start
564 < start.checked_sub(&self.max_len).unwrap_or_else(zero::<I>)
565 {
566 *cursor += 1;
567 }
568
569 IterFind {
570 inner: self,
571 off: *cursor,
572 start,
573 stop,
574 }
575 }
576}
577
578impl<I: PrimInt, T: Clone> Lapper<I, T> {
579 pub fn merge_overlaps(&mut self) {
582 let mut stack: VecDeque<&mut Interval<I, T>> = VecDeque::new();
583 let mut ivs = self.intervals.iter_mut();
584 if let Some(first) = ivs.next() {
585 stack.push_back(first);
586 for interval in ivs {
587 let top = stack.pop_back().unwrap();
588 if top.stop < interval.start {
589 stack.push_back(top);
590 stack.push_back(interval);
591 } else if top.stop < interval.stop {
592 top.stop = interval.stop;
593 stack.push_back(top);
595 } else {
596 stack.push_back(top);
598 }
599 }
600 self.overlaps_merged = true;
601 self.intervals = stack
602 .into_iter()
603 .map(|x| Interval {
604 start: x.start,
605 stop: x.stop,
606 val: x.val.clone(),
607 })
608 .collect();
609 }
610 let (mut starts, mut stops): (Vec<_>, Vec<_>) =
612 self.intervals.iter().map(|x| (x.start, x.stop)).unzip();
613 starts.sort();
614 stops.sort();
615 self.starts = starts;
616 self.stops = stops;
617 self.max_len = self
618 .intervals
619 .iter()
620 .map(|x| x.stop.checked_sub(&x.start).unwrap_or_else(zero::<I>))
621 .max()
622 .unwrap_or_else(zero::<I>);
623 }
624}
625
626#[derive(Debug)]
628pub struct IterFind<'a, I, T> {
629 inner: &'a Lapper<I, T>,
630 off: usize,
631 start: I,
632 stop: I,
633}
634
635impl<'a, I: PrimInt, T> Iterator for IterFind<'a, I, T> {
636 type Item = &'a Interval<I, T>;
637
638 #[inline]
639 fn next(&mut self) -> Option<Self::Item> {
641 while self.off < self.inner.intervals.len() {
642 let interval = &self.inner.intervals[self.off];
645 self.off += 1;
646 if interval.overlap(self.start, self.stop) {
647 return Some(interval);
648 } else if interval.start >= self.stop {
649 break;
650 }
651 }
652 None
653 }
654}
655
656#[derive(Debug)]
658pub struct IterDepth<'a, I, T> {
659 inner: &'a Lapper<I, T>,
660 merged: Lapper<I, bool>, curr_merged_pos: I, curr_pos: usize, cursor: usize, end: usize, }
666
667impl<'a, I: PrimInt, T: Clone> Iterator for IterDepth<'a, I, T> {
668 type Item = Interval<I, I>;
669
670 #[inline]
671 fn next(&mut self) -> Option<Self::Item> {
672 let mut interval: &Interval<I, bool> = &self.merged.intervals[self.curr_pos];
673 if self.curr_merged_pos == zero::<I>() {
674 self.curr_merged_pos = interval.start;
675 }
676 if interval.stop == self.curr_merged_pos {
677 if self.curr_pos + 1 != self.end {
678 self.curr_pos += 1;
679 interval = &self.merged.intervals[self.curr_pos];
680 self.curr_merged_pos = interval.start;
681 } else {
682 return None;
683 }
684 }
685 let start = self.curr_merged_pos;
686 let depth_at_point = self
687 .inner
688 .seek(
689 self.curr_merged_pos,
690 self.curr_merged_pos + one::<I>(),
691 &mut self.cursor,
692 )
693 .count();
694 let mut new_depth_at_point = depth_at_point;
695 while new_depth_at_point == depth_at_point && self.curr_merged_pos < interval.stop {
696 self.curr_merged_pos = self.curr_merged_pos + one::<I>();
697 new_depth_at_point = self
698 .inner
699 .seek(
700 self.curr_merged_pos,
701 self.curr_merged_pos + one::<I>(),
702 &mut self.cursor,
703 )
704 .count();
705 }
706 Some(Interval {
707 start,
708 stop: self.curr_merged_pos,
709 val: I::from(depth_at_point).unwrap(), })
711 }
712}
713pub struct IterLapper<'a, I, T> {
715 inner: &'a Lapper<I, T>,
716 pos: usize,
717}
718
719impl<'a, I, T> Iterator for IterLapper<'a, I, T> {
720 type Item = &'a Interval<I, T>;
721
722 fn next(&mut self) -> Option<Self::Item> {
723 if self.pos >= self.inner.intervals.len() {
724 None
725 } else {
726 self.pos += 1;
727 self.inner.intervals.get(self.pos - 1)
728 }
729 }
730}
731
732impl<I, T> IntoIterator for Lapper<I, T> {
733 type Item = Interval<I, T>;
734 type IntoIter = ::std::vec::IntoIter<Self::Item>;
735
736 fn into_iter(self) -> Self::IntoIter {
737 self.intervals.into_iter()
738 }
739}
740
741impl<'a, I, T> IntoIterator for &'a Lapper<I, T> {
742 type Item = &'a Interval<I, T>;
743 type IntoIter = std::slice::Iter<'a, Interval<I, T>>;
744
745 fn into_iter(self) -> std::slice::Iter<'a, Interval<I, T>> {
746 self.intervals.iter()
747 }
748}
749
750impl<'a, I, T> IntoIterator for &'a mut Lapper<I, T> {
751 type Item = &'a mut Interval<I, T>;
752 type IntoIter = std::slice::IterMut<'a, Interval<I, T>>;
753
754 fn into_iter(self) -> std::slice::IterMut<'a, Interval<I, T>> {
755 self.intervals.iter_mut()
756 }
757}
758
759#[cfg(test)]
760#[rustfmt::skip]
761mod tests {
762 use super::*;
763
764 type Iv = Interval<usize, u32>;
765 fn setup_nonoverlapping() -> Lapper<usize, u32> {
766 let data: Vec<Iv> = (0..100)
767 .step_by(20)
768 .map(|x| Iv {
769 start: x,
770 stop: x + 10,
771 val: 0,
772 })
773 .collect();
774 Lapper::new(data)
775 }
776
777 fn setup_overlapping() -> Lapper<usize, u32> {
778 let data: Vec<Iv> = (0..100)
779 .step_by(10)
780 .map(|x| Iv {
781 start: x,
782 stop: x + 15,
783 val: 0,
784 })
785 .collect();
786 Lapper::new(data)
787 }
788
789 fn setup_badlapper() -> Lapper<usize, u32> {
790 let data: Vec<Iv> = vec![
791 Iv{start: 70, stop: 120, val: 0}, Iv{start: 10, stop: 15, val: 0},
793 Iv{start: 10, stop: 15, val: 0}, Iv{start: 12, stop: 15, val: 0}, Iv{start: 14, stop: 16, val: 0}, Iv{start: 40, stop: 45, val: 0},
797 Iv{start: 50, stop: 55, val: 0},
798 Iv{start: 60, stop: 65, val: 0},
799 Iv{start: 68, stop: 71, val: 0}, Iv{start: 70, stop: 75, val: 0},
801 ];
802 Lapper::new(data)
803 }
804
805 fn setup_single() -> Lapper<usize, u32> {
806 let data: Vec<Iv> = vec![Iv {
807 start: 10,
808 stop: 35,
809 val: 0,
810 }];
811 Lapper::new(data)
812 }
813
814 #[test]
816 fn insert_equality_nonoverlapping() {
817 let data: Vec<Iv> = (0..100)
818 .step_by(20)
819 .map(|x| Iv {
820 start: x,
821 stop: x + 10,
822 val: 0,
823 })
824 .collect();
825 let new_lapper = Lapper::new(data.clone());
826 let mut insert_lapper = Lapper::new(vec![]);
827 for elem in data {
828 insert_lapper.insert(elem);
829 }
830 assert_eq!(new_lapper.starts, insert_lapper.starts);
831 assert_eq!(new_lapper.stops, insert_lapper.stops);
832 assert_eq!(new_lapper.intervals, insert_lapper.intervals);
833 assert_eq!(new_lapper.max_len, insert_lapper.max_len);
834 }
835
836 #[test]
838 fn insert_equality_overlapping() {
839 let data: Vec<Iv> = (0..100)
840 .step_by(10)
841 .map(|x| Iv {
842 start: x,
843 stop: x + 15,
844 val: 0,
845 })
846 .collect();
847 let new_lapper = Lapper::new(data.clone());
848 let mut insert_lapper = Lapper::new(vec![]);
849 for elem in data {
850 insert_lapper.insert(elem);
851 }
852 assert_eq!(new_lapper.starts, insert_lapper.starts);
853 assert_eq!(new_lapper.stops, insert_lapper.stops);
854 assert_eq!(new_lapper.intervals, insert_lapper.intervals);
855 assert_eq!(new_lapper.max_len, insert_lapper.max_len);
856 }
857
858 #[test]
861 fn insert_equality_half_and_half() {
862 let data: Vec<Iv> = (0..100)
863 .step_by(1)
864 .map(|x| Iv {
865 start: x,
866 stop: x + 15,
867 val: 0,
868 })
869 .collect();
870 let new_lapper = Lapper::new(data.clone());
871 let (new_data, insert_data) = data.split_at(50);
872 let mut insert_lapper = Lapper::new(new_data.to_vec());
873 let mut insert_data = insert_data.to_vec();
874 insert_data.reverse();
875 for elem in insert_data {
876 insert_lapper.insert(elem);
877 }
878 assert_eq!(new_lapper.starts, insert_lapper.starts);
879 assert_eq!(new_lapper.stops, insert_lapper.stops);
880 assert_eq!(new_lapper.intervals, insert_lapper.intervals);
881 assert_eq!(new_lapper.max_len, insert_lapper.max_len);
882 }
883
884 #[test]
886 fn insert_equality_badlapper() {
887 let data: Vec<Iv> = vec![
888 Iv{start: 70, stop: 120, val: 0}, Iv{start: 10, stop: 15, val: 0},
890 Iv{start: 10, stop: 15, val: 0}, Iv{start: 12, stop: 15, val: 0}, Iv{start: 14, stop: 16, val: 0}, Iv{start: 40, stop: 45, val: 0},
894 Iv{start: 50, stop: 55, val: 0},
895 Iv{start: 60, stop: 65, val: 0},
896 Iv{start: 68, stop: 71, val: 0}, Iv{start: 70, stop: 75, val: 0},
898 ];
899 let new_lapper = Lapper::new(data.clone());
900 let mut insert_lapper = Lapper::new(vec![]);
901 for elem in data {
902 insert_lapper.insert(elem);
903 }
904 assert_eq!(new_lapper.starts, insert_lapper.starts);
905 assert_eq!(new_lapper.stops, insert_lapper.stops);
906 assert_eq!(new_lapper.intervals, insert_lapper.intervals);
907 assert_eq!(new_lapper.max_len, insert_lapper.max_len);
908 }
909
910 #[test]
912 fn insert_equality_single() {
913 let data: Vec<Iv> = vec![Iv {
914 start: 10,
915 stop: 35,
916 val: 0,
917 }];
918 let new_lapper = Lapper::new(data.clone());
919 let mut insert_lapper = Lapper::new(vec![]);
920 for elem in data {
921 insert_lapper.insert(elem);
922 }
923 assert_eq!(new_lapper.starts, insert_lapper.starts);
924 assert_eq!(new_lapper.stops, insert_lapper.stops);
925 assert_eq!(new_lapper.intervals, insert_lapper.intervals);
926 assert_eq!(new_lapper.max_len, insert_lapper.max_len);
927 }
928
929 #[test]
931 fn test_query_stop_interval_start() {
932 let lapper = setup_nonoverlapping();
933 let mut cursor = 0;
934 assert_eq!(None, lapper.find(15, 20).next());
935 assert_eq!(None, lapper.seek(15, 20, &mut cursor).next());
936 assert_eq!(lapper.find(15, 20).count(), lapper.count(15, 20));
937 }
938
939 #[test]
941 fn test_query_start_interval_stop() {
942 let lapper = setup_nonoverlapping();
943 let mut cursor = 0;
944 assert_eq!(None, lapper.find(30, 35).next());
945 assert_eq!(None, lapper.seek(30, 35, &mut cursor).next());
946 assert_eq!(lapper.find(30, 35).count(), lapper.count(30, 35));
947 }
948
949 #[test]
951 fn test_query_overlaps_interval_start() {
952 let lapper = setup_nonoverlapping();
953 let mut cursor = 0;
954 let expected = Iv {
955 start: 20,
956 stop: 30,
957 val: 0,
958 };
959 assert_eq!(Some(&expected), lapper.find(15, 25).next());
960 assert_eq!(Some(&expected), lapper.seek(15, 25, &mut cursor).next());
961 assert_eq!(lapper.find(15, 25).count(), lapper.count(15, 25));
962 }
963
964 #[test]
966 fn test_query_overlaps_interval_stop() {
967 let lapper = setup_nonoverlapping();
968 let mut cursor = 0;
969 let expected = Iv {
970 start: 20,
971 stop: 30,
972 val: 0,
973 };
974 assert_eq!(Some(&expected), lapper.find(25, 35).next());
975 assert_eq!(Some(&expected), lapper.seek(25, 35, &mut cursor).next());
976 assert_eq!(lapper.find(25, 35).count(), lapper.count(25, 35));
977 }
978
979 #[test]
981 fn test_interval_envelops_query() {
982 let lapper = setup_nonoverlapping();
983 let mut cursor = 0;
984 let expected = Iv {
985 start: 20,
986 stop: 30,
987 val: 0,
988 };
989 assert_eq!(Some(&expected), lapper.find(22, 27).next());
990 assert_eq!(Some(&expected), lapper.seek(22, 27, &mut cursor).next());
991 assert_eq!(lapper.find(22, 27).count(), lapper.count(22, 27));
992 }
993
994 #[test]
996 fn test_query_envolops_interval() {
997 let lapper = setup_nonoverlapping();
998 let mut cursor = 0;
999 let expected = Iv {
1000 start: 20,
1001 stop: 30,
1002 val: 0,
1003 };
1004 assert_eq!(Some(&expected), lapper.find(15, 35).next());
1005 assert_eq!(Some(&expected), lapper.seek(15, 35, &mut cursor).next());
1006 assert_eq!(lapper.find(15, 35).count(), lapper.count(15, 35));
1007 }
1008
1009 #[test]
1010 fn test_overlapping_intervals() {
1011 let lapper = setup_overlapping();
1012 let mut cursor = 0;
1013 let e1 = Iv {
1014 start: 0,
1015 stop: 15,
1016 val: 0,
1017 };
1018 let e2 = Iv {
1019 start: 10,
1020 stop: 25,
1021 val: 0,
1022 };
1023 assert_eq!(vec![&e1, &e2], lapper.find(8, 20).collect::<Vec<&Iv>>());
1024 assert_eq!(
1025 vec![&e1, &e2],
1026 lapper.seek(8, 20, &mut cursor).collect::<Vec<&Iv>>()
1027 );
1028 assert_eq!(lapper.count(8, 20), 2);
1029 }
1030
1031 #[test]
1032 fn test_merge_overlaps() {
1033 let mut lapper = setup_badlapper();
1034 let expected: Vec<&Iv> = vec![
1035 &Iv{start: 10, stop: 16, val: 0},
1036 &Iv{start: 40, stop: 45, val: 0},
1037 &Iv{start: 50, stop: 55, val: 0},
1038 &Iv{start: 60, stop: 65, val: 0},
1039 &Iv{start: 68, stop: 120, val: 0}, ];
1041 assert_eq!(lapper.intervals.len(), lapper.starts.len());
1042 lapper.merge_overlaps();
1043 assert_eq!(expected, lapper.iter().collect::<Vec<&Iv>>());
1044 assert_eq!(lapper.intervals.len(), lapper.starts.len())
1045
1046 }
1047
1048 #[test]
1051 fn test_merge_overlaps_find() {
1052 let data = vec![
1053 Iv{start: 2, stop: 3, val: 0},
1054 Iv{start: 3, stop: 4, val: 0},
1055 Iv{start: 4, stop: 6, val: 0},
1056 Iv{start: 6, stop: 7, val: 0},
1057 Iv{start: 7, stop: 8, val: 0},
1058 ];
1059 let mut lapper = Lapper::new(data);
1060
1061 let found = lapper.find(7, 9).collect::<Vec<&Interval<_,_>>>();
1062 assert_eq!(found, vec![
1063 &Iv{start:7, stop: 8, val: 0},
1064 ]);
1065
1066 lapper.merge_overlaps();
1068
1069 let found = lapper.find(7, 9).collect::<Vec<&Interval<_,_>>>();
1070 assert_eq!(found, vec![
1071 &Iv{start:2, stop: 8, val: 0},
1072 ]);
1073 }
1074
1075 #[test]
1076 fn test_lapper_cov() {
1077 let mut lapper = setup_badlapper();
1078 let before = lapper.cov();
1079 lapper.merge_overlaps();
1080 let after = lapper.cov();
1081 assert_eq!(before, after);
1082
1083 let mut lapper = setup_nonoverlapping();
1084 lapper.set_cov();
1085 assert_eq!(lapper.cov(), 50);
1086 }
1087
1088 #[test]
1089 fn test_interval_intersects() {
1090 let i1 = Iv{start: 70, stop: 120, val: 0}; let i2 = Iv{start: 10, stop: 15, val: 0};
1092 let i3 = Iv{start: 10, stop: 15, val: 0}; let i4 = Iv{start: 12, stop: 15, val: 0}; let i5 = Iv{start: 14, stop: 16, val: 0}; let i6 = Iv{start: 40, stop: 50, val: 0};
1096 let i7 = Iv{start: 50, stop: 55, val: 0};
1097 let i_8 = Iv{start: 60, stop: 65, val: 0};
1098 let i9 = Iv{start: 68, stop: 71, val: 0}; let i10 = Iv{start: 70, stop: 75, val: 0};
1100
1101 assert_eq!(i2.intersect(&i3), 5); assert_eq!(i2.intersect(&i4), 3); assert_eq!(i2.intersect(&i5), 1); assert_eq!(i9.intersect(&i10), 1); assert_eq!(i7.intersect(&i_8), 0); assert_eq!(i6.intersect(&i7), 0); assert_eq!(i1.intersect(&i10), 5); }
1109
1110 #[test]
1111 fn test_union_and_intersect() {
1112 let data1: Vec<Iv> = vec![
1113 Iv{start: 70, stop: 120, val: 0}, Iv{start: 10, stop: 15, val: 0}, Iv{start: 12, stop: 15, val: 0}, Iv{start: 14, stop: 16, val: 0}, Iv{start: 68, stop: 71, val: 0}, ];
1119 let data2: Vec<Iv> = vec![
1120
1121 Iv{start: 10, stop: 15, val: 0},
1122 Iv{start: 40, stop: 45, val: 0},
1123 Iv{start: 50, stop: 55, val: 0},
1124 Iv{start: 60, stop: 65, val: 0},
1125 Iv{start: 70, stop: 75, val: 0},
1126 ];
1127
1128 let (mut lapper1, mut lapper2) = (Lapper::new(data1), Lapper::new(data2)) ;
1129 let (union, intersect) = lapper1.union_and_intersect(&lapper2);
1131 assert_eq!(intersect, 10);
1132 assert_eq!(union, 73);
1133 let (union, intersect) = lapper2.union_and_intersect(&lapper1);
1134 assert_eq!(intersect, 10);
1135 assert_eq!(union, 73);
1136 lapper1.merge_overlaps();
1137 lapper1.set_cov();
1138 lapper2.merge_overlaps();
1139 lapper2.set_cov();
1140
1141 let (union, intersect) = lapper1.union_and_intersect(&lapper2);
1143 assert_eq!(intersect, 10);
1144 assert_eq!(union, 73);
1145 let (union, intersect) = lapper2.union_and_intersect(&lapper1);
1146 assert_eq!(intersect, 10);
1147 assert_eq!(union, 73);
1148 }
1149
1150 #[test]
1151 fn test_find_overlaps_in_large_intervals() {
1152 let data1: Vec<Iv> = vec![
1153 Iv{start: 0, stop: 8, val: 0},
1154 Iv{start: 1, stop: 10, val: 0},
1155 Iv{start: 2, stop: 5, val: 0},
1156 Iv{start: 3, stop: 8, val: 0},
1157 Iv{start: 4, stop: 7, val: 0},
1158 Iv{start: 5, stop: 8, val: 0},
1159 Iv{start: 8, stop: 8, val: 0},
1160 Iv{start: 9, stop: 11, val: 0},
1161 Iv{start: 10, stop: 13, val: 0},
1162 Iv{start: 100, stop: 200, val: 0},
1163 Iv{start: 110, stop: 120, val: 0},
1164 Iv{start: 110, stop: 124, val: 0},
1165 Iv{start: 111, stop: 160, val: 0},
1166 Iv{start: 150, stop: 200, val: 0},
1167 ];
1168 let lapper = Lapper::new(data1);
1169 let found = lapper.find(8, 11).collect::<Vec<&Iv>>();
1170 assert_eq!(found, vec![
1171 &Iv{start: 1, stop: 10, val: 0},
1172 &Iv{start: 9, stop: 11, val: 0},
1173 &Iv{start: 10, stop: 13, val: 0},
1174 ]);
1175 assert_eq!(lapper.count(8, 11), 3);
1176 let found = lapper.find(145, 151).collect::<Vec<&Iv>>();
1177 assert_eq!(found, vec![
1178 &Iv{start: 100, stop: 200, val: 0},
1179 &Iv{start: 111, stop: 160, val: 0},
1180 &Iv{start: 150, stop: 200, val: 0},
1181 ]);
1182
1183 assert_eq!(lapper.count(145, 151), 3);
1184 }
1185
1186 #[test]
1187 fn test_depth_sanity() {
1188 let data1: Vec<Iv> = vec![
1189 Iv{start: 0, stop: 10, val: 0},
1190 Iv{start: 5, stop: 10, val: 0}
1191 ];
1192 let lapper = Lapper::new(data1);
1193 let found = lapper.depth().collect::<Vec<Interval<usize, usize>>>();
1194 assert_eq!(found, vec![
1195 Interval{start: 0, stop: 5, val: 1},
1196 Interval{start: 5, stop: 10, val: 2}
1197 ]);
1198 }
1199
1200 #[test]
1201 fn test_depth_hard() {
1202 let data1: Vec<Iv> = vec![
1203 Iv{start: 1, stop: 10, val: 0},
1204 Iv{start: 2, stop: 5, val: 0},
1205 Iv{start: 3, stop: 8, val: 0},
1206 Iv{start: 3, stop: 8, val: 0},
1207 Iv{start: 3, stop: 8, val: 0},
1208 Iv{start: 5, stop: 8, val: 0},
1209 Iv{start: 9, stop: 11, val: 0},
1210 ];
1211 let lapper = Lapper::new(data1);
1212 let found = lapper.depth().collect::<Vec<Interval<usize, usize>>>();
1213 assert_eq!(found, vec![
1214 Interval{start: 1, stop: 2, val: 1},
1215 Interval{start: 2, stop: 3, val: 2},
1216 Interval{start: 3, stop: 8, val: 5},
1217 Interval{start: 8, stop: 9, val: 1},
1218 Interval{start: 9, stop: 10, val: 2},
1219 Interval{start: 10, stop: 11, val: 1},
1220 ]);
1221 }
1222 #[test]
1223 fn test_depth_harder() {
1224 let data1: Vec<Iv> = vec![
1225 Iv{start: 1, stop: 10, val: 0},
1226 Iv{start: 2, stop: 5, val: 0},
1227 Iv{start: 3, stop: 8, val: 0},
1228 Iv{start: 3, stop: 8, val: 0},
1229 Iv{start: 3, stop: 8, val: 0},
1230 Iv{start: 5, stop: 8, val: 0},
1231 Iv{start: 9, stop: 11, val: 0},
1232 Iv{start: 15, stop: 20, val: 0},
1233 ];
1234 let lapper = Lapper::new(data1);
1235 let found = lapper.depth().collect::<Vec<Interval<usize, usize>>>();
1236 assert_eq!(found, vec![
1237 Interval{start: 1, stop: 2, val: 1},
1238 Interval{start: 2, stop: 3, val: 2},
1239 Interval{start: 3, stop: 8, val: 5},
1240 Interval{start: 8, stop: 9, val: 1},
1241 Interval{start: 9, stop: 10, val: 2},
1242 Interval{start: 10, stop: 11, val: 1},
1243 Interval{start: 15, stop: 20, val: 1},
1244 ]);
1245 }
1246 #[test]
1251 fn test_seek_over_len() {
1252 let lapper = setup_nonoverlapping();
1253 let single = setup_single();
1254 let mut cursor: usize = 0;
1255
1256 for interval in lapper.iter() {
1257 for o_interval in single.seek(interval.start, interval.stop, &mut cursor) {
1258 println!("{:#?}", o_interval);
1259 }
1260 }
1261 }
1262
1263 #[test]
1265 fn test_find_over_behind_first_match() {
1266 let lapper = setup_badlapper();
1267 let e1 = Iv {start: 50, stop: 55, val: 0};
1268 let found = lapper.find(50, 55).next();
1269 assert_eq!(found, Some(&e1));
1270 assert_eq!(lapper.find(50, 55).count(), lapper.count(50,55));
1271 }
1272
1273 #[test]
1276 fn test_bad_skips() {
1277 let data = vec![
1278 Iv{start:25264912, stop: 25264986, val: 0},
1279 Iv{start:27273024, stop: 27273065 , val: 0},
1280 Iv{start:27440273, stop: 27440318 , val: 0},
1281 Iv{start:27488033, stop: 27488125 , val: 0},
1282 Iv{start:27938410, stop: 27938470 , val: 0},
1283 Iv{start:27959118, stop: 27959171 , val: 0},
1284 Iv{start:28866309, stop: 33141404 , val: 0},
1285 ];
1286 let lapper = Lapper::new(data);
1287
1288 let found = lapper.find(28974798, 33141355).collect::<Vec<&Iv>>();
1289 assert_eq!(found, vec![
1290 &Iv{start:28866309, stop: 33141404 , val: 0},
1291 ]);
1292 assert_eq!(lapper.count(28974798, 33141355), 1);
1293 }
1294
1295 #[test]
1296 fn serde_test() {
1297 let data = vec![
1298 Iv{start:25264912, stop: 25264986, val: 0},
1299 Iv{start:27273024, stop: 27273065 , val: 0},
1300 Iv{start:27440273, stop: 27440318 , val: 0},
1301 Iv{start:27488033, stop: 27488125 , val: 0},
1302 Iv{start:27938410, stop: 27938470 , val: 0},
1303 Iv{start:27959118, stop: 27959171 , val: 0},
1304 Iv{start:28866309, stop: 33141404 , val: 0},
1305 ];
1306 let lapper = Lapper::new(data);
1307
1308 let ser = rkyv::to_bytes::<rkyv::rancor::Error>(&lapper).unwrap();
1309 let deser: Lapper<usize, u32> = rkyv::from_bytes::<Lapper<usize, u32>, rkyv::rancor::Error>(&ser).unwrap();
1310
1311 let found = deser.find(28974798, 33141355).collect::<Vec<&Iv>>();
1312 assert_eq!(found, vec![
1313 &Iv{start:28866309, stop: 33141404 , val: 0},
1314 ]);
1315 assert_eq!(deser.count(28974798, 33141355), 1);
1316 }
1317
1318}