package au.id.zancanaro; import java.util.Iterator; public class Generators { @SafeVarargs public static Generator arrayGenerator(Generator... generators) { return Generator.tuple((Generator[]) generators); } public static Generator integerGenerator() { return (random, size) -> { int value = random.nextInt(size); return new RoseTree<>(value, intShrinkingIterable(value)); }; } private static Iterable> intShrinkingIterable(final int value) { return () -> new Iterator>() { int curr = value; @Override public boolean hasNext() { return curr > 0; } @Override public RoseTree next() { int prevCurr = curr; curr = curr / 2; return new RoseTree<>(value - prevCurr, intShrinkingIterable(value - prevCurr)); } }; } }