aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/FiniteUpperCardinality.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/FiniteUpperCardinality.java')
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/FiniteUpperCardinality.java83
1 files changed, 83 insertions, 0 deletions
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/FiniteUpperCardinality.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/FiniteUpperCardinality.java
new file mode 100644
index 00000000..478d456b
--- /dev/null
+++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/FiniteUpperCardinality.java
@@ -0,0 +1,83 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.logic.term.uppercardinality;
7
8import org.jetbrains.annotations.NotNull;
9import org.jetbrains.annotations.Nullable;
10
11import java.util.function.IntBinaryOperator;
12
13public record FiniteUpperCardinality(int finiteUpperBound) implements UpperCardinality {
14 public FiniteUpperCardinality {
15 if (finiteUpperBound < 0) {
16 throw new IllegalArgumentException("finiteUpperBound must not be negative");
17 }
18 }
19
20 @Override
21 public UpperCardinality add(UpperCardinality other) {
22 return lift(other, Integer::sum);
23 }
24
25 @Override
26 @Nullable
27 public UpperCardinality take(int count) {
28 if (finiteUpperBound < count) {
29 return null;
30 }
31 return new FiniteUpperCardinality(finiteUpperBound - count);
32 }
33
34 @Override
35 public UpperCardinality multiply(UpperCardinality other) {
36 return lift(other, (a, b) -> a * b);
37 }
38
39 @Override
40 public int compareTo(@NotNull UpperCardinality upperCardinality) {
41 if (upperCardinality instanceof FiniteUpperCardinality finiteUpperCardinality) {
42 return compareToInt(finiteUpperCardinality.finiteUpperBound);
43 }
44 if (upperCardinality instanceof UnboundedUpperCardinality) {
45 return -1;
46 }
47 throw new IllegalArgumentException("Unknown UpperCardinality: " + upperCardinality);
48 }
49
50 @Override
51 public int compareToInt(int value) {
52 return Integer.compare(finiteUpperBound, value);
53 }
54
55 @Override
56 public String toString() {
57 return Integer.toString(finiteUpperBound);
58 }
59
60 private UpperCardinality lift(@NotNull UpperCardinality other, IntBinaryOperator operator) {
61 if (other instanceof FiniteUpperCardinality finiteUpperCardinality) {
62 return UpperCardinalities.atMost(operator.applyAsInt(finiteUpperBound,
63 finiteUpperCardinality.finiteUpperBound));
64 }
65 if (other instanceof UnboundedUpperCardinality) {
66 return UpperCardinalities.UNBOUNDED;
67 }
68 throw new IllegalArgumentException("Unknown UpperCardinality: " + other);
69 }
70
71 @Override
72 public boolean equals(Object o) {
73 if (this == o) return true;
74 if (o == null || getClass() != o.getClass()) return false;
75 FiniteUpperCardinality that = (FiniteUpperCardinality) o;
76 return finiteUpperBound == that.finiteUpperBound;
77 }
78
79 @Override
80 public int hashCode() {
81 return finiteUpperBound;
82 }
83}