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() {
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 #[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 #[inline]
456 pub fn intersect(&self, other: &Self) -> I {
457 self.union_and_intersect(other).1
458 }
459
460 #[inline]
462 pub fn union(&self, other: &Self) -> I {
463 self.union_and_intersect(other).0
464 }
465
466 #[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 #[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 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 }
536
537 #[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 #[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 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.push_back(top);
616 } else {
617 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 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#[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 fn next(&mut self) -> Option<Self::Item> {
664 while self.off < self.inner.intervals.len() {
665 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#[derive(Debug)]
681pub struct IterDepth<'a, I, T>
682{
683 inner: &'a Lapper<I, T>,
684 merged: Lapper<I, bool>, curr_merged_pos: I, curr_pos: usize, cursor: usize, end: usize, }
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(), })
736 }
737}
738pub 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}, Iv{start: 10, stop: 15, val: 0},
823 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},
827 Iv{start: 50, stop: 55, val: 0},
828 Iv{start: 60, stop: 65, val: 0},
829 Iv{start: 68, stop: 71, val: 0}, 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]
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]
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]
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]
916 fn insert_equality_badlapper() {
917 let data: Vec<Iv> = vec![
918 Iv{start: 70, stop: 120, val: 0}, Iv{start: 10, stop: 15, val: 0},
920 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},
924 Iv{start: 50, stop: 55, val: 0},
925 Iv{start: 60, stop: 65, val: 0},
926 Iv{start: 68, stop: 71, val: 0}, 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]
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]
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]
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]
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]
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]
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]
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}, ];
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 #[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 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}; let i2 = Iv{start: 10, stop: 15, val: 0};
1122 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};
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}; let i10 = Iv{start: 70, stop: 75, val: 0};
1130
1131 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); }
1139
1140 #[test]
1141 fn test_union_and_intersect() {
1142 let data1: Vec<Iv> = vec![
1143 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}, ];
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 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 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 #[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]
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 #[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}