fast_down/base/
merge_progress.rs1use crate::{Mergeable, ProgressEntry};
2
3pub trait MergeProgress {
4 fn merge_progress(&mut self, new: ProgressEntry);
5}
6
7impl MergeProgress for Vec<ProgressEntry> {
8 fn merge_progress(&mut self, new: ProgressEntry) {
9 let i = self.partition_point(|old| old.start < new.start);
10 if i == self.len() {
11 match self.last_mut() {
12 Some(last) if last.end == new.start => {
13 last.end = new.end;
14 }
15 _ => self.push(new),
16 }
17 } else {
18 let u1 = if i == 0 {
19 false
20 } else {
21 self[i - 1].can_merge(&new)
22 };
23 let u2 = self[i].can_merge(&new);
24 if u1 && u2 {
25 self[i - 1].end = self[i].end;
26 self.remove(i);
27 } else if u1 {
28 self[i - 1].end = new.end;
29 } else if u2 {
30 self[i].start = new.start;
31 } else {
32 self.insert(i, new);
33 }
34 }
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41
42 #[test]
43 fn test_merge_into_empty_vec() {
44 let mut v: Vec<ProgressEntry> = Vec::new();
45 v.merge_progress(10..20);
46 assert_eq!(v, vec![10..20]);
47 }
48
49 #[test]
50 fn test_append_non_overlapping() {
51 let mut v = vec![1..5];
52 v.merge_progress(6..10);
53 assert_eq!(v, vec![1..5, 6..10]);
54 }
55
56 #[test]
57 fn test_prepend_non_overlapping() {
58 let mut v = vec![6..10];
59 v.merge_progress(1..5);
60 assert_eq!(v, vec![1..5, 6..10]);
61 }
62
63 #[test]
64 fn test_merge_with_last() {
65 let mut v = vec![1..5];
66 v.merge_progress(5..10);
67 assert_eq!(v, vec![1..10]);
68 }
69
70 #[test]
71 fn test_insert_between_two() {
72 let mut v = vec![1..5, 10..15];
73 v.merge_progress(6..8);
74 assert_eq!(v, vec![1..5, 6..8, 10..15]);
75 }
76
77 #[test]
78 fn test_merge_adjacent() {
79 let mut v = vec![1..5];
80 v.merge_progress(5..10);
81 assert_eq!(v, vec![1..10]);
82 }
83}