static IterableIterator> allSpreads(final int toSpread, final int buckets) { ret iff(new F0 { L collecting = ll(0); L remaining = ll(toSpread); public O get() { while true { ping(); // 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); } } }); }