auto foo = Ways([Way([8,2,3,0]),Way([4,6,2]),Way([4,7,2,6])]);
assert(foo==Ways([Way([8, 2]), Way([4, 6, 2]), Way([4]), Way([0]), Way([2, 6])]));
foreach (point, void delegate(void delegate(Way way)) remove;way)
remove(delegate(Way way) {new_ways ~= way;});
auto opApply(int delegate(int, void delegate(void delegate(Way way))) work)
void delegate(Way) add_new_way;
foreach (index,point;points)
if (auto result=work(point,(void delegate(Way) anw){remove~=index; add_new_way=anw;}))
import std.algorithm.sorting: sort;
foreach (index;remove.sort!("a>b"))
add_new_way(Way(points[index+1..$]));
points = points[0..index];