From d29e1d49116c66adab72b1c1bb49c1fa3d4f8140 Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Sat, 30 May 2015 02:00:43 +1000 Subject: Initial commit: only works for plain int typed arguments --- src/main/java/au/id/zancanaro/Generators.java | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/au/id/zancanaro/Generators.java (limited to 'src/main/java/au/id/zancanaro/Generators.java') 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 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)); + } + }; + } +} -- cgit v1.2.3