aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Majewsky <majewsky@gmx.net>2025-01-11 16:13:00 +0100
committerStefan Majewsky <majewsky@gmx.net>2025-01-11 16:13:00 +0100
commite739523ac1f926007fcfd8d82e5559df37cc6c6b (patch)
treed994348fd95b091d9966dc7c36f891bef86b1fb6
parent7eec3798588243c493791a421e6224680870d0e2 (diff)
downloadgo-gg-e739523ac1f926007fcfd8d82e5559df37cc6c6b.tar.gz
add options.Map()
-rw-r--r--options/options.go11
-rw-r--r--options/options_test.go6
2 files changed, 16 insertions, 1 deletions
diff --git a/options/options.go b/options/options.go
index 9754e2d..bfae710 100644
--- a/options/options.go
+++ b/options/options.go
@@ -21,10 +21,19 @@ func FromPointer[T any](value *T) Option[T] {
}
}
-// IsNoneOrZero returns whether the Option is either empty, or contains a zero value.
+// IsNoneOrZero returns whether o 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
})
}
+
+// Map applies the given function to the value contained in o, if there is one.
+func Map[T, U any](o Option[T], mapping func(T) U) Option[U] {
+ if t, ok := o.Unpack(); ok {
+ return Some(mapping(t))
+ } else {
+ return None[U]()
+ }
+}
diff --git a/options/options_test.go b/options/options_test.go
index 9947b9d..caeb303 100644
--- a/options/options_test.go
+++ b/options/options_test.go
@@ -7,6 +7,7 @@
package options
import (
+ "strconv"
"testing"
. "github.com/majewsky/gg/internal/test"
@@ -23,3 +24,8 @@ func TestIsNoneOrZero(t *testing.T) {
AssertEqual(t, IsNoneOrZero(Some(0)), true)
AssertEqual(t, IsNoneOrZero(Some(1)), false)
}
+
+func TestMap(t *testing.T) {
+ AssertEqual(t, Map(None[int](), strconv.Itoa), None[string]())
+ AssertEqual(t, Map(Some(42), strconv.Itoa), Some("42"))
+}