aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java')
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java31
1 files changed, 29 insertions, 2 deletions
diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java
index 38bd53bf..6bd66df7 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java
@@ -5,6 +5,7 @@
5 */ 5 */
6package tools.refinery.store.representation.cardinality; 6package tools.refinery.store.representation.cardinality;
7 7
8import java.util.Objects;
8import java.util.function.BinaryOperator; 9import java.util.function.BinaryOperator;
9import java.util.function.IntBinaryOperator; 10import java.util.function.IntBinaryOperator;
10 11
@@ -53,6 +54,16 @@ public record NonEmptyCardinalityInterval(int lowerBound, UpperCardinality upper
53 return lift(other, Math::min, UpperCardinality::max, this); 54 return lift(other, Math::min, UpperCardinality::max, this);
54 } 55 }
55 56
57 @Override
58 public CardinalityInterval take(int count) {
59 int newLowerBound = Math.max(lowerBound - count, 0);
60 var newUpperBound = upperBound.take(count);
61 if (newUpperBound == null) {
62 return CardinalityIntervals.ERROR;
63 }
64 return CardinalityIntervals.between(newLowerBound, newUpperBound);
65 }
66
56 private CardinalityInterval lift(CardinalityInterval other, IntBinaryOperator lowerOperator, 67 private CardinalityInterval lift(CardinalityInterval other, IntBinaryOperator lowerOperator,
57 BinaryOperator<UpperCardinality> upperOperator, 68 BinaryOperator<UpperCardinality> upperOperator,
58 CardinalityInterval whenEmpty) { 69 CardinalityInterval whenEmpty) {
@@ -73,7 +84,23 @@ public record NonEmptyCardinalityInterval(int lowerBound, UpperCardinality upper
73 84
74 @Override 85 @Override
75 public String toString() { 86 public String toString() {
76 var closeBracket = upperBound instanceof UnboundedUpperCardinality ? ")" : "]"; 87 if (upperBound instanceof FiniteUpperCardinality finiteUpperCardinality &&
77 return "[%d..%s%s".formatted(lowerBound, upperBound, closeBracket); 88 finiteUpperCardinality.finiteUpperBound() == lowerBound) {
89 return "[%d]".formatted(lowerBound);
90 }
91 return "[%d..%s]".formatted(lowerBound, upperBound);
92 }
93
94 @Override
95 public boolean equals(Object o) {
96 if (this == o) return true;
97 if (o == null || getClass() != o.getClass()) return false;
98 NonEmptyCardinalityInterval that = (NonEmptyCardinalityInterval) o;
99 return lowerBound == that.lowerBound && Objects.equals(upperBound, that.upperBound);
100 }
101
102 @Override
103 public int hashCode() {
104 return lowerBound * 31 + upperBound.hashCode();
78 } 105 }
79} 106}