#![warn(missing_docs)]
pub trait VecRemoveIf<T> {
fn remove_if<F: Fn(&T) -> bool>(&mut self, closure: F) -> Vec<T>;
fn swap_remove_if<F: Fn(&T) -> bool>(&mut self, closure: F) -> Vec<T>;
}
impl<T> VecRemoveIf<T> for Vec<T> {
fn remove_if<F: Fn(&T) -> bool>(&mut self, closure: F) -> Vec<T> {
common(self, closure, &mut Vec::remove)
}
fn swap_remove_if<F: Fn(&T) -> bool>(&mut self, closure: F) -> Vec<T> {
common(self, closure, &mut Vec::swap_remove)
}
}
fn common<T, F: Fn(&T) -> bool, A: FnMut(&mut Vec<T>, usize) -> T>(
v: &mut Vec<T>,
closure: F,
action: &mut A,
) -> Vec<T> {
let mut i = 0;
let mut r = Vec::new();
while i < v.len() {
if closure(&v[i]) {
r.push(action(v, i))
} else {
i += 1;
}
}
r
}