Skip to content

Commit 5736c50

Browse files
refactor: Add xor
1 parent 2375576 commit 5736c50

2 files changed

Lines changed: 21 additions & 3 deletions

File tree

src/main/java/net/marcellperger/mathexpr/util/rs/Option.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.stream.Stream;
1414

1515
public sealed interface Option<T> extends Iterable<T> {
16+
// hashCode, equals are automatically implemented for `record`s
1617
record Some<T>(T value) implements Option<T> {
1718
@Contract(pure = true)
1819
@Override
@@ -169,7 +170,16 @@ default Option<T> filter(Predicate<? super T> predicate) {
169170
};
170171
}
171172

173+
default Option<T> xor(Option<T> right) {
174+
return switch (this) { // I wish this implementation was more elegant
175+
case Some<T> left -> right.isNone() ? left : newNone();
176+
case None() -> right;
177+
};
178+
}
179+
172180
// no insert / get_or_insert(_*) / take(_if) / replace
173-
// (as record is immutable in Java)
174-
// TODO check Rust docs
181+
// (as record is immutable in Java)
182+
// no (un)zip(_with) because no tuples in Java (will do if needed tho)
183+
// rest are `impl`s on compound types which Java can't do
184+
// (see Result.java for detailed explanation), can do static method if we need it so much
175185
}

src/test/java/net/marcellperger/mathexpr/util/rs/OptionTest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ void filter() {
298298
void or() {
299299
assertEquals(getSome(), getSome().or(Option.newSome(271)));
300300
assertEquals(getSome(), getSome().or(getNone()));
301-
assertEquals(Option.newSome(271), getNone().or(Option.newSome(271)));
301+
assertEquals(getSome(), getNone().or(getSome()));
302302
assertEquals(getNone(), getNone().or(getNone()));
303303
}
304304

@@ -321,4 +321,12 @@ void orElse() {
321321
mNone.assertCalledOnce();
322322
}
323323
}
324+
325+
@Test
326+
void xor() {
327+
assertEquals(getNone(), getSome().xor(Option.newSome(271)));
328+
assertEquals(getSome(), getSome().xor(getNone()));
329+
assertEquals(getSome(), getNone().xor(getSome()));
330+
assertEquals(getNone(), getNone().xor(getNone()));
331+
}
324332
}

0 commit comments

Comments
 (0)