File tree Expand file tree Collapse file tree
main/java/net/marcellperger/mathexpr/util/rs
test/java/net/marcellperger/mathexpr/util/rs Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1313import java .util .stream .Stream ;
1414
1515public 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}
Original file line number Diff line number Diff 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}
You can’t perform that action at this time.
0 commit comments