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(); // return list if (l(collecting) >= buckets-1) { L result = listPlus(collecting, last(remaining)); dropLast(collecting); dropLast(remaining); setLast(collecting, last(collecting)+1); ret result; } // backtrace while (nempty(collecting) && last(collecting) >= last(remaining)) { dropLast(collecting); dropLast(remaining); } // done if (empty(collecting)) ret endMarker(); // recurse collecting.add(0); remaining.add(last(remaining)); } } }); }