summaryrefslogtreecommitdiff
path: root/src/main/java/au/id/zancanaro/Generators.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/au/id/zancanaro/Generators.java')
-rw-r--r--src/main/java/au/id/zancanaro/Generators.java35
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));
+ }
+ };
+ }
+}