1use std::collections::VecDeque;
2
3mod private {
4 pub trait Sealed {}
5
6 impl<T> Sealed for Vec<T> {}
7}
8
9pub trait VecExt: private::Sealed {
11 fn remove_indices(&mut self, to_remove: VecDeque<usize>);
14}
15
16impl<T> VecExt for Vec<T> {
17 fn remove_indices(&mut self, mut to_remove: VecDeque<usize>) {
18 let mut i = 0;
19
20 let mut next_remove = to_remove.pop_front();
21
22 self.retain(|_| {
23 let keep = if let Some(next_remove) = next_remove {
24 i != next_remove
25 } else {
26 true
27 };
28
29 if !keep {
30 next_remove = to_remove.pop_front();
31 }
32
33 i += 1;
34 keep
35 });
36 }
37}
38
39#[cfg(test)]
40mod tests {
41 use std::collections::VecDeque;
42
43 use crate::vec_ext::VecExt;
44
45 #[test]
46 fn removes_requested_indices() {
47 let mut data: Vec<i32> = (0..10).collect();
48 let remove: VecDeque<usize> = vec![1, 4, 6].into_iter().collect();
49
50 data.remove_indices(remove);
51
52 assert_eq!(data, vec![0, 2, 3, 5, 7, 8, 9])
53 }
54}