summaryrefslogtreecommitdiff
path: root/src/main/java/au/id/zancanaro/Generators.java
blob: f065d1d3f808148db0b3b126476007fad95a2d0f (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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));
            }
        };
    }
}