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