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