static IterableIterator> allSpreads(final int toSpread, final int buckets) { class StackEntry { int remaining, n, take; L collecting; int position; O step(L stack) { if (position == 0) { if (l(collecting) >= n-1) { L result = listPlus(collecting, remaining); dropLast(stack); ret result; } position++; } else if (position == 1) { if (take <= remaining) { collecting.add(take); new StackEntry e; e.remaining = remaining-take; e.n = n; e.collecting = collecting; stack.add(e); position++; } else dropLast(stack); } else if (position == 2) { removeLast(collecting); take++; position = 1; } null; } } final new L stack; new StackEntry e; e.n = buckets; e.remaining = toSpread; e.collecting = new L; stack.add(e); ret iff(func { while (nempty(stack)) { ping(); try object last(stack).step(stack); } ret endMarker(); }); }