harper_core/
vec_ext.rs

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