From fef70631f4d1be56d772816af22778efebcc8391 Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Mon, 1 Jun 2015 12:47:05 +1000 Subject: Fix up list shrinking, remove minor superfluous things --- .../java/au/id/zancanaro/javacheck/RoseTree.java | 28 +++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'src/main/java/au/id/zancanaro/javacheck/RoseTree.java') diff --git a/src/main/java/au/id/zancanaro/javacheck/RoseTree.java b/src/main/java/au/id/zancanaro/javacheck/RoseTree.java index d9fb508..4d7b770 100644 --- a/src/main/java/au/id/zancanaro/javacheck/RoseTree.java +++ b/src/main/java/au/id/zancanaro/javacheck/RoseTree.java @@ -38,7 +38,7 @@ public class RoseTree { tree.getValue().children.iterator())); } - public static Iterator[]> permutations(RoseTree[] trees) { + private static Iterator[]> permutations(RoseTree[] trees) { return Iterators.flatten(Iterators.rangeIterator(trees.length, index -> Iterators.mappingIterator(child -> { @SuppressWarnings("unchecked") @@ -64,6 +64,32 @@ public class RoseTree { RoseTree.permutations(trees))); } + private static Iterator[]> removeEach(RoseTree[] trees) { + return Iterators.concat( + Iterators.rangeIterator(trees.length, index -> { + @SuppressWarnings("unchecked") + RoseTree[] result = (RoseTree[]) new RoseTree[trees.length - 1]; + for (int i = 0; i < trees.length - 1; ++i) { + result[i] = trees[(i >= index ? i + 1 : i)]; + } + return result; + }), + permutations(trees)); + } + + public static RoseTree shrink(Function, R> fn, RoseTree[] trees) { + @SuppressWarnings("unchecked") + List heads = new ArrayList(trees.length); + for (RoseTree tree : trees) { + heads.add(tree.getValue()); + } + return new RoseTree<>( + fn.apply(heads), + () -> Iterators.mappingIterator( + roses -> RoseTree.shrink(fn, roses), + RoseTree.removeEach(trees))); + } + public RoseTree fmap(Function f) { return new RoseTree<>( f.apply(this.value), -- cgit v1.2.3