So I have Vec<Vec<Foo>>
, and fn criteria(&Foo, &Foo)->bool
.
I want to look at Vec<Vec<Foo>>
as flat structure, row by row,
where the last element of Vec<Vec<Foo>>[0]
and the first element of Vec<Vec<Foo>>[1]
are adjacent.
And I want to find all ajdancent Foo
that match criteria
and remove them.
I wrote the code, but it looks too verbose,
can anybody suggest something to simplify the code bellow?
fn find_and_remove(vec_of_vec: &mut Vec<Vec<Foo>>) {
let mut prev: Option<(usize, &Foo)> = None;
let mut to_remove = vec![];
for (i, cur) in vec_of_vec.iter().flatten().enumerate() {
if let Some((prev_i, prev_val)) = prev {
if (prev_i + 1) == i && criteria(prev_val, cur) {
to_remove.push(prev_i);
to_remove.push(i);
}
}
prev = Some((i, cur));
}
let mut n: usize = vec_of_vec.iter().map(Vec::len).sum();
'main_loop: for j in (0..vec_of_vec.len()).rev() {
let start = n - vec_of_vec[j].len();
loop {
let Some(last_idx) = to_remove.last() else {
break 'main_loop;
};
if start <= *last_idx {
vec_of_vec[j].remove(*last_idx - start);
to_remove.pop();
} else {
break;
}
}
n = start;
}
}