1use bincode::{Decode, Encode};
79use num_traits::{identities::{one, zero}, PrimInt};
80use std::cmp::Ordering::{self};
81use std::collections::VecDeque;
82
83#[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#[derive(Encode, Decode, Debug, Clone)]
96pub struct Lapper<I, T>
97{
98 pub intervals: Vec<Interval<I, T>>,
100 starts: Vec<I>,
102 stops: Vec<I>,
104 max_len: I,
106 cov: Option<I>,
108 pub overlaps_merged: bool,
110}
111
112impl<I: PrimInt, T> Interval<I, T>
113{
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{
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 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 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 #[inline]
243 pub fn len(&self) -> usize {
244 self.intervals.len()
245 }
246
247 #[inline]
255 pub fn is_empty(&self) -> bool {
256 self.intervals.is_empty()
257 }
258
259 #[inline]
269 pub fn cov(&self) -> I {
270 match self.cov {
271 None => self.calculate_coverage(),
272 Some(cov) => cov,
273 }
274 }
275
276 pub fn set_cov(&mut self) -> I {
279 let cov = self.calculate_coverage();
280 self.cov = Some(cov);
281 cov
282 }
283
284 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 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 cov = cov + (moving_interval.stop - moving_interval.start);
301 moving_interval.start = interval.start;
302 moving_interval.stop = interval.stop;
303 }
304 }
305 cov = cov + (moving_interval.stop - moving_interval.start);
307 cov
308 }
309
310 #[inline]
312 pub fn iter(&self) -> IterLapper<'_, I, T> {
313 IterLapper {
314 inner: self,
315 pos: 0,
316 }
317 }
318
319 #[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 #[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 #[inline]
451 pub fn intersect(&self, other: &Self) -> I {
452 self.union_and_intersect(other).1
453 }
454
455 #[inline]
457 pub fn union(&self, other: &Self) -> I {
458 self.union_and_intersect(other).0
459 }
460
461 #[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 #[inline]
511 pub fn count(&self, start: I, stop: I) -> usize {
512 let len = self.intervals.len();
513 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 #[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 #[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 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.push_back(top);
599 } else {
600 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 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#[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 fn next(&mut self) -> Option<Self::Item> {
647 while self.off < self.inner.intervals.len() {
648 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#[derive(Debug)]
664pub struct IterDepth<'a, I, T>
665{
666 inner: &'a Lapper<I, T>,
667 merged: Lapper<I, bool>, curr_merged_pos: I, curr_pos: usize, cursor: usize, end: usize, }
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(), })
719 }
720}
721pub 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}, Iv{start: 10, stop: 15, val: 0},
806 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},
810 Iv{start: 50, stop: 55, val: 0},
811 Iv{start: 60, stop: 65, val: 0},
812 Iv{start: 68, stop: 71, val: 0}, 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]
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]
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]
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]
899 fn insert_equality_badlapper() {
900 let data: Vec<Iv> = vec![
901 Iv{start: 70, stop: 120, val: 0}, Iv{start: 10, stop: 15, val: 0},
903 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},
907 Iv{start: 50, stop: 55, val: 0},
908 Iv{start: 60, stop: 65, val: 0},
909 Iv{start: 68, stop: 71, val: 0}, 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]
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]
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]
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]
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]
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]
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]
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}, ];
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 #[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 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}; let i2 = Iv{start: 10, stop: 15, val: 0};
1105 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};
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}; let i10 = Iv{start: 70, stop: 75, val: 0};
1113
1114 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); }
1122
1123 #[test]
1124 fn test_union_and_intersect() {
1125 let data1: Vec<Iv> = vec![
1126 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}, ];
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 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 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 #[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]
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 #[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}