static IterableIterator> allSpreads(final int toSpread, final int buckets) { ret iff(new F0 { L collecting = ll(); int remaining = toSpread; bool incrementing; public O get() { while true { ping(); if (incrementing) if (remaining == 0) { remaining -= last(collecting); dropLast(collecting); if (empty(collecting)) ret endMarker(); } else { setLast(collecting, last(collecting)+1); --remaining; // return list if (l(collecting) >= buckets-1) L result = listPlus(collecting, last(remaining)); setLast(collecting, last(collecting)+1); ret result; } // backtrace while (nempty(collecting) && last(collecting) >= last(remaining)) { dropLast(collecting); dropLast(remaining); setLast(collecting, last(collecting)+1); } // done if (empty(collecting)) ret endMarker(); // recurse remaining.add(last(remaining)-last(collecting)); collecting.add(0); } } }); }