pub trait VecExtns<T> {
fn push_back(&mut self, t: T) -> usize;
fn push_back_with(&mut self, ctor: impl FnMut(usize) -> T) -> usize;
fn new_init<U: FnMut(usize) -> T>(size: usize, initf: U) -> Vec<T>;
}
impl<T> VecExtns<T> for Vec<T> {
fn push_back(&mut self, t: T) -> usize {
self.push(t);
self.len() - 1
}
fn push_back_with(&mut self, mut ctor: impl FnMut(usize) -> T) -> usize {
let idx = self.len();
self.push(ctor(idx));
idx
}
fn new_init<U: FnMut(usize) -> T>(size: usize, mut initf: U) -> Vec<T> {
let mut v = Vec::<T>::with_capacity(size);
for i in 0..size {
v.push(initf(i));
}
v
}
}