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(); if (empty(collecting)) ret endMarker(); if (l(collecting) > buckets) { dropLast(remaining); dropLast(collecting); ret cloneList(collecting); } if (last(collecting) < last(remaining)) { setLast(collecting, last(collecting)+1); remaining.add(last(remaining)-last(collecting)); collecting.add(0); } else { dropLast(collecting); dropLast(remaining); } } } }); }