fix duplicate ReactionUnit for multiple kth indices
Signed-off-by: kernelkind <kernelkind@gmail.com>
This commit is contained in:
@@ -77,8 +77,12 @@ impl NoteUnits {
|
|||||||
return InsertManyResponse::Zero;
|
return InsertManyResponse::Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut touched = Vec::new();
|
||||||
if !touched_indices.is_empty() {
|
if !touched_indices.is_empty() {
|
||||||
self.order.retain(|i| !touched_indices.contains(i));
|
touched = touched_indices.to_vec();
|
||||||
|
touched.sort_unstable(); // sort for later reinsertion
|
||||||
|
touched.dedup();
|
||||||
|
self.order.retain(|i| touched.binary_search(i).is_err()); // temporarily remove touched from Self::order
|
||||||
}
|
}
|
||||||
|
|
||||||
units.sort_unstable();
|
units.sort_unstable();
|
||||||
@@ -95,17 +99,20 @@ impl NoteUnits {
|
|||||||
new_order.push(idx);
|
new_order.push(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
let front_insertion = if self.order.is_empty() || new_order.is_empty() {
|
let inserted_new = new_order.len();
|
||||||
true
|
|
||||||
} else if !self.reversed {
|
let front_insertion = inserted_new > 0
|
||||||
let first_new = *new_order.first().unwrap();
|
&& if self.order.is_empty() || new_order.is_empty() {
|
||||||
let last_old = *self.order.last().unwrap();
|
true
|
||||||
self.storage[first_new] >= self.storage[last_old]
|
} else if !self.reversed {
|
||||||
} else {
|
let first_new = *new_order.first().unwrap();
|
||||||
let last_new = *new_order.last().unwrap();
|
let last_old = *self.order.last().unwrap();
|
||||||
let first_old = *self.order.first().unwrap();
|
self.storage[first_new] >= self.storage[last_old]
|
||||||
self.storage[last_new] <= self.storage[first_old]
|
} else {
|
||||||
};
|
let last_new = *new_order.last().unwrap();
|
||||||
|
let first_old = *self.order.first().unwrap();
|
||||||
|
self.storage[last_new] <= self.storage[first_old]
|
||||||
|
};
|
||||||
|
|
||||||
let mut merged = Vec::with_capacity(self.order.len() + new_order.len());
|
let mut merged = Vec::with_capacity(self.order.len() + new_order.len());
|
||||||
let (mut i, mut j) = (0, 0);
|
let (mut i, mut j) = (0, 0);
|
||||||
@@ -126,26 +133,26 @@ impl NoteUnits {
|
|||||||
merged.extend_from_slice(&self.order[i..]);
|
merged.extend_from_slice(&self.order[i..]);
|
||||||
merged.extend_from_slice(&new_order[j..]);
|
merged.extend_from_slice(&new_order[j..]);
|
||||||
|
|
||||||
for &touched_index in touched_indices {
|
// reinsert touched
|
||||||
|
for touched_index in touched {
|
||||||
let pos = merged
|
let pos = merged
|
||||||
.binary_search_by(|&i2| self.storage[i2].cmp(&self.storage[touched_index]))
|
.binary_search_by(|&i2| self.storage[i2].cmp(&self.storage[touched_index]))
|
||||||
.unwrap_or_else(|p| p);
|
.unwrap_or_else(|p| p);
|
||||||
merged.insert(pos, touched_index);
|
merged.insert(pos, touched_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
let inserted = merged.len() - self.order.len();
|
|
||||||
self.order = merged;
|
self.order = merged;
|
||||||
|
|
||||||
if inserted == 0 {
|
if inserted_new == 0 {
|
||||||
InsertManyResponse::Zero
|
InsertManyResponse::Zero
|
||||||
} else if front_insertion {
|
} else if front_insertion {
|
||||||
InsertManyResponse::Some {
|
InsertManyResponse::Some {
|
||||||
entries_merged: inserted,
|
entries_merged: inserted_new,
|
||||||
merge_kind: MergeKind::FrontInsert,
|
merge_kind: MergeKind::FrontInsert,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
InsertManyResponse::Some {
|
InsertManyResponse::Some {
|
||||||
entries_merged: inserted,
|
entries_merged: inserted_new,
|
||||||
merge_kind: MergeKind::Spliced,
|
merge_kind: MergeKind::Spliced,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user