diff --git a/lib/std/collections/maybe.c3 b/lib/std/collections/maybe.c3 index 9442b1fa8..94e8ea387 100644 --- a/lib/std/collections/maybe.c3 +++ b/lib/std/collections/maybe.c3 @@ -34,3 +34,12 @@ macro Type? Maybe.get(self) { return self.has_value ? self.value : NOT_FOUND?; } + +fn bool Maybe.equals(self, Maybe other) @operator(==) @if(types::is_equatable_type(Type)) +{ + if (self.has_value) + { + return other.has_value && equals(self.value, other.value); + } + return !other.has_value; +} diff --git a/releasenotes.md b/releasenotes.md index c727a6779..8dd6ebea9 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -45,6 +45,7 @@ - Add `String.replace` and `String.treplace` to replace substrings within a string. - Add `Duration * Int` and `Clock - Clock` overload. - Add `DateTime + Duration` overloads. +- Add `Maybe.equals` and respective `==` operator when the inner type is equatable. ## 0.7.1 Change list diff --git a/test/unit/stdlib/collections/maybe.c3 b/test/unit/stdlib/collections/maybe.c3 new file mode 100644 index 000000000..748a60b14 --- /dev/null +++ b/test/unit/stdlib/collections/maybe.c3 @@ -0,0 +1,21 @@ +module maybetest @test; + +import std::collections::maybe; +import std::core::types; + +alias maybeint = maybe::value{int}; + +struct Unequatable { int value; } + +alias MaybeUnequatable = maybe::Maybe{Unequatable}; + +fn void test_equals() @test +{ + $assert(!types::is_equatable_type(MaybeUnequatable)); + assert(maybeint(1) == maybeint(1)); + assert(maybeint(0) == maybeint(0)); + assert(maybeint(0) != maybeint(1)); + assert(maybeint(1) != maybeint(0)); + assert(maybeint(0) != maybe::EMPTY{int}); + assert(maybe::EMPTY{int} != maybeint(0)); +}