@@ -495,28 +495,53 @@ impl Selection {
496 /// Normalizes a `Selection`.
496 /// Normalizes a `Selection`.
497 fn normalize(mut self) -> Self {
497 fn normalize(mut self) -> Self {
498− let primary = self.ranges[self.primary_index];
498+ let mut primary = self.ranges[self.primary_index];
499 self.ranges.sort_unstable_by_key(Range::from);
499 self.ranges.sort_unstable_by_key(Range::from);
501+ self.ranges.dedup_by(|curr_range, prev_range| {
502+ if prev_range.overlaps(curr_range) {
503+ let new_range = curr_range.merge(*prev_range);
504+ if prev_range == &primary || curr_range == &primary {
505+ primary = new_range;
507+ *prev_range = new_range;
500 self.primary_index = self
514 self.primary_index = self
503 .position(|&range| range == primary)
517 .position(|&range| range == primary)
504 .unwrap();
518 .unwrap();
506− let mut prev_i = 0;
520+ self
507− for i in 1..self.ranges.len() {
521+ }
508− if self.ranges[prev_i].overlaps(&self.ranges[i]) {
522+
509− self.ranges[prev_i] = self.ranges[prev_i].merge(self.ranges[i]);
523+ // Merges all ranges that are consecutive
524+ pub fn merge_consecutive_ranges(mut self) -> Self {
525+ let mut primary = self.ranges[self.primary_index];
527+ self.ranges.dedup_by(|curr_range, prev_range| {
528+ if prev_range.to() == curr_range.from() {
529+ let new_range = curr_range.merge(*prev_range);
530+ if prev_range == &primary || curr_range == &primary {
531+ primary = new_range;
533+ *prev_range = new_range;
511− prev_i += 1;
536+ false
512− self.ranges[prev_i] = self.ranges[i];
514− if i == self.primary_index {
515− self.primary_index = prev_i;
519− self.ranges.truncate(prev_i + 1);
540+ self.primary_index = self
543+ .position(|&range| range == primary)
@@ -1132,6 +1157,52 @@ mod test {
1132 &["", "abcd", "efg", "rs", "xyz"]
1157 &["", "abcd", "efg", "rs", "xyz"]
1162+ fn test_merge_consecutive_ranges() {
1163+ let selection = Selection::new(
1167+ Range::new(15, 20),
1168+ Range::new(25, 26),
1174+ let result = selection.merge_consecutive_ranges();
1178+ &[Range::new(0, 10), Range::new(15, 20), Range::new(25, 30)]
1180+ assert_eq!(result.primary_index, 2);
1182+ let selection = Selection::new(smallvec![Range::new(0, 1)], 0);
1183+ let result = selection.merge_consecutive_ranges();
1185+ assert_eq!(result.ranges(), &[Range::new(0, 1)]);
1186+ assert_eq!(result.primary_index, 0);
1188+ let selection = Selection::new(
1194+ Range::new(10, 15),
1200+ let result = selection.merge_consecutive_ranges();
1202+ assert_eq!(result.ranges(), &[Range::new(0, 15), Range::new(18, 25)]);
1203+ assert_eq!(result.primary_index, 0);
1136 fn test_selection_contains() {
1207 fn test_selection_contains() {
1137 fn contains(a: Vec<(usize, usize)>, b: Vec<(usize, usize)>) -> bool {
1208 fn contains(a: Vec<(usize, usize)>, b: Vec<(usize, usize)>) -> bool {