diff options
author | Carlo Zancanaro <carlo@zancanaro.id.au> | 2015-05-30 02:00:43 +1000 |
---|---|---|
committer | Carlo Zancanaro <carlo@zancanaro.id.au> | 2015-05-30 02:00:43 +1000 |
commit | d29e1d49116c66adab72b1c1bb49c1fa3d4f8140 (patch) | |
tree | 17363b0d5b939c217cc95e4c57326e01c45d121e /src/main/java/au/id/zancanaro/Generators.java |
Initial commit: only works for plain int typed arguments
Diffstat (limited to 'src/main/java/au/id/zancanaro/Generators.java')
-rw-r--r-- | src/main/java/au/id/zancanaro/Generators.java | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/main/java/au/id/zancanaro/Generators.java b/src/main/java/au/id/zancanaro/Generators.java new file mode 100644 index 0000000..f065d1d --- /dev/null +++ b/src/main/java/au/id/zancanaro/Generators.java @@ -0,0 +1,35 @@ +package au.id.zancanaro; + +import java.util.Iterator; + +public class Generators { + @SafeVarargs + public static <T> Generator<T[]> arrayGenerator(Generator<? extends T>... generators) { + return Generator.tuple((Generator<T>[]) generators); + } + + public static Generator<Integer> integerGenerator() { + return (random, size) -> { + int value = random.nextInt(size); + return new RoseTree<>(value, intShrinkingIterable(value)); + }; + } + + private static Iterable<RoseTree<Integer>> intShrinkingIterable(final int value) { + return () -> new Iterator<RoseTree<Integer>>() { + int curr = value; + + @Override + public boolean hasNext() { + return curr > 0; + } + + @Override + public RoseTree<Integer> next() { + int prevCurr = curr; + curr = curr / 2; + return new RoseTree<>(value - prevCurr, intShrinkingIterable(value - prevCurr)); + } + }; + } +} |