harper_core/
vec_ext.rs

1use std::collections::VecDeque;
2
3/// Extensions on top of [`Vec`] that make certain common operations easier.
4pub trait VecExt {
5    /// Removes a list of indices from a Vector.
6    /// Assumes that the provided indices are already in sorted order.
7    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}