diff options
| -rw-r--r-- | option/option.go | 2 | ||||
| -rw-r--r-- | option/option_test.go | 21 | ||||
| -rw-r--r-- | options/options.go | 8 | ||||
| -rw-r--r-- | options/options_test.go | 6 |
4 files changed, 33 insertions, 4 deletions
diff --git a/option/option.go b/option/option.go index 992c7b7..39fc56d 100644 --- a/option/option.go +++ b/option/option.go @@ -203,6 +203,8 @@ func (o Option[T]) IsSomeAnd(predicate func(T) bool) bool { } // IsNoneOr returns whether the Option is either empty, or contains a value that matches the given predicate. +// +// If the predicate compares against the zero value, use options.IsNoneOrZero() instead. func (o Option[T]) IsNoneOr(predicate func(T) bool) bool { return !o.isSome || predicate(o.value) } diff --git a/option/option_test.go b/option/option_test.go index 0fa255f..28e6d49 100644 --- a/option/option_test.go +++ b/option/option_test.go @@ -33,11 +33,12 @@ func TestAsSlice(t *testing.T) { AssertEqual(t, Some(42).AsSlice(), []int{42}) } -func TestFilter(t *testing.T) { - isEven := func(x int) bool { - return x%2 == 0 - } +func isEven(x int) bool { + // an example predicate for testing the various functions that take predicates + return x%2 == 0 +} +func TestFilter(t *testing.T) { AssertEqual(t, None[int]().Filter(isEven), None[int]()) AssertEqual(t, Some(41).Filter(isEven), None[int]()) AssertEqual(t, Some(42).Filter(isEven), Some(42)) @@ -48,11 +49,23 @@ func TestIsNone(t *testing.T) { AssertEqual(t, Some(42).IsNone(), false) } +func TestIsNoneOr(t *testing.T) { + AssertEqual(t, None[int]().IsNoneOr(isEven), true) + AssertEqual(t, Some(41).IsNoneOr(isEven), false) + AssertEqual(t, Some(42).IsNoneOr(isEven), true) +} + func TestIsSome(t *testing.T) { AssertEqual(t, None[int]().IsSome(), false) AssertEqual(t, Some(42).IsSome(), true) } +func TestIsSomeAnd(t *testing.T) { + AssertEqual(t, None[int]().IsSomeAnd(isEven), false) + AssertEqual(t, Some(41).IsSomeAnd(isEven), false) + AssertEqual(t, Some(42).IsSomeAnd(isEven), true) +} + func TestIsZero(t *testing.T) { AssertEqual(t, None[int]().IsZero(), true) AssertEqual(t, Some(42).IsZero(), false) diff --git a/options/options.go b/options/options.go index e058559..9754e2d 100644 --- a/options/options.go +++ b/options/options.go @@ -20,3 +20,11 @@ func FromPointer[T any](value *T) Option[T] { return Some(*value) } } + +// IsNoneOrZero returns whether the Option is either empty, or contains a zero value. +func IsNoneOrZero[T comparable](o Option[T]) bool { + return o.IsNoneOr(func(value T) bool { + var zero T + return zero == value + }) +} diff --git a/options/options_test.go b/options/options_test.go index 69a4b43..9947b9d 100644 --- a/options/options_test.go +++ b/options/options_test.go @@ -17,3 +17,9 @@ func TestFromPointer(t *testing.T) { AssertEqual(t, FromPointer[int](nil), None[int]()) AssertEqual(t, FromPointer(PointerTo[int](42)), Some(42)) } + +func TestIsNoneOrZero(t *testing.T) { + AssertEqual(t, IsNoneOrZero(None[int]()), true) + AssertEqual(t, IsNoneOrZero(Some(0)), true) + AssertEqual(t, IsNoneOrZero(Some(1)), false) +} |
