diff options
Diffstat (limited to 'subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/Rule.java')
-rw-r--r-- | subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/Rule.java | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/Rule.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/Rule.java new file mode 100644 index 00000000..ff45ed3e --- /dev/null +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/Rule.java | |||
@@ -0,0 +1,99 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.store.dse.transition; | ||
7 | |||
8 | import tools.refinery.store.dse.transition.actions.Action; | ||
9 | import tools.refinery.store.dse.transition.actions.BoundAction; | ||
10 | import tools.refinery.store.dse.transition.callback.*; | ||
11 | import tools.refinery.store.model.Model; | ||
12 | import tools.refinery.store.query.dnf.RelationalQuery; | ||
13 | |||
14 | public class Rule { | ||
15 | private final String name; | ||
16 | private final RelationalQuery precondition; | ||
17 | private final Action action; | ||
18 | |||
19 | public Rule(String name, RelationalQuery precondition, Action action) { | ||
20 | if (precondition.arity() != action.getArity()) { | ||
21 | throw new IllegalArgumentException("Expected an action clause with %d parameters, got %d instead" | ||
22 | .formatted(precondition.arity(), action.getArity())); | ||
23 | } | ||
24 | this.name = name; | ||
25 | this.precondition = precondition; | ||
26 | this.action = action; | ||
27 | } | ||
28 | |||
29 | public String getName() { | ||
30 | return name; | ||
31 | } | ||
32 | |||
33 | public RelationalQuery getPrecondition() { | ||
34 | return precondition; | ||
35 | } | ||
36 | |||
37 | public BoundAction createAction(Model model) { | ||
38 | return action.bindToModel(model); | ||
39 | } | ||
40 | |||
41 | public static RuleBuilder builder(String name) { | ||
42 | return new RuleBuilder(name); | ||
43 | } | ||
44 | |||
45 | public static RuleBuilder builder() { | ||
46 | return builder(null); | ||
47 | } | ||
48 | |||
49 | public static Rule of(String name, RuleCallback0 callback) { | ||
50 | var builder = builder(name); | ||
51 | callback.accept(builder); | ||
52 | return builder.build(); | ||
53 | } | ||
54 | |||
55 | public static Rule of(RuleCallback0 callback) { | ||
56 | return of(null, callback); | ||
57 | } | ||
58 | |||
59 | public static Rule of(String name, RuleCallback1 callback) { | ||
60 | var builder = builder(name); | ||
61 | callback.accept(builder, builder.parameter("p1")); | ||
62 | return builder.build(); | ||
63 | } | ||
64 | |||
65 | public static Rule of(RuleCallback1 callback) { | ||
66 | return of(null, callback); | ||
67 | } | ||
68 | |||
69 | public static Rule of(String name, RuleCallback2 callback) { | ||
70 | var builder = builder(name); | ||
71 | callback.accept(builder, builder.parameter("p1"), builder.parameter("p2")); | ||
72 | return builder.build(); | ||
73 | } | ||
74 | |||
75 | public static Rule of(RuleCallback2 callback) { | ||
76 | return of(null, callback); | ||
77 | } | ||
78 | |||
79 | public static Rule of(String name, RuleCallback3 callback) { | ||
80 | var builder = builder(name); | ||
81 | callback.accept(builder, builder.parameter("p1"), builder.parameter("p2"), builder.parameter("p3")); | ||
82 | return builder.build(); | ||
83 | } | ||
84 | |||
85 | public static Rule of(RuleCallback3 callback) { | ||
86 | return of(null, callback); | ||
87 | } | ||
88 | |||
89 | public static Rule of(String name, RuleCallback4 callback) { | ||
90 | var builder = builder(name); | ||
91 | callback.accept(builder, builder.parameter("p1"), builder.parameter("p2"), builder.parameter("p3"), | ||
92 | builder.parameter("p4")); | ||
93 | return builder.build(); | ||
94 | } | ||
95 | |||
96 | public static Rule of(RuleCallback4 callback) { | ||
97 | return of(null, callback); | ||
98 | } | ||
99 | } | ||