sclass Flattener { new L out; void add(O o) { if (o cast O[]) for (x : o) add(o); else if (o cast Iterable) for (x : o) add(o); else if (o != null) add o; } L toList() { ret out; } O[] toArray() { ret toObjectArray(out); } }