diff options
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.java | 31 |
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 | */ |
6 | package tools.refinery.store.representation.cardinality; | 6 | package tools.refinery.store.representation.cardinality; |
7 | 7 | ||
8 | import java.util.Objects; | ||
8 | import java.util.function.BinaryOperator; | 9 | import java.util.function.BinaryOperator; |
9 | import java.util.function.IntBinaryOperator; | 10 | import 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 | } |