harper_core/
vec_ext.rs

1use std::collections::VecDeque;
2
3pub trait VecExt {
4    /// Removes a list of indices from a Vector.
5    /// Assumes that the provided indices are already in sorted order.
6    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}