1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
pub trait VecMore<T> { fn move_to<F>(&mut self, to: &mut Vec<T>, f: F) where F: FnMut(&T) -> bool; } impl<T> VecMore<T> for Vec<T> { fn move_to<F>(&mut self, to: &mut Vec<T>, mut f: F) where F: FnMut(&T) -> bool, { let len = self.len(); let mut del = 0; { let v = &mut **self; for i in 0..len { if f(&v[i]) { del += 1; } else if del > 0 { v.swap(i - del, i); } } } if del > 0 { while del > 0 { let v = match self.pop() { Some(v) => v, None => break, }; to.push(v); del -= 1; } } } }