1 package net.bmahe.genetics4j.gp.spec.mutation;
2
3 import java.util.function.BiFunction;
4 import java.util.function.Predicate;
5
6 import org.apache.commons.lang3.Validate;
7 import org.immutables.value.Value;
8
9 import net.bmahe.genetics4j.core.chromosomes.TreeNode;
10 import net.bmahe.genetics4j.gp.Operation;
11 import net.bmahe.genetics4j.gp.program.Program;
12
13 @Value.Immutable
14 public interface Rule {
15
16 @Value.Parameter
17 Predicate<TreeNode<Operation<?>>> predicate();
18
19 @Value.Parameter
20 BiFunction<Program, TreeNode<Operation<?>>, TreeNode<Operation<?>>> applicator();
21
22 default boolean test(final TreeNode<Operation<?>> root) {
23 Validate.notNull(root);
24
25 return predicate().test(root);
26 }
27
28 default TreeNode<Operation<?>> apply(final Program program, final TreeNode<Operation<?>> root) {
29 Validate.notNull(program);
30 Validate.notNull(root);
31
32 return applicator().apply(program, root);
33 }
34 }