Skip to content

Commit dcaafb1

Browse files
committed
feat: add TryOr() TryOrElse() func to Option type
1 parent 45aaaba commit dcaafb1

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

option/option.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,22 @@ func (o Option[T]) OrElse(f func() Option[T]) Option[T] {
245245
return f()
246246
}
247247

248+
func TryOr[T, U, E any](o Option[T], f func(T) U, e E) result.Result[U, E] {
249+
if o.some {
250+
return result.Ok[U, E](f(o.value))
251+
}
252+
return result.Err[U, E](e)
253+
}
254+
255+
func TryOrElse[T, U, E any](o Option[T], f func(T) U, closure func() result.Result[U, E]) result.Result[U, E] {
256+
if o.some {
257+
return result.Ok[U, E](f(o.value))
258+
}
259+
closure()
260+
// unreachable
261+
return closure()
262+
}
263+
248264
func (o Option[T]) Xor(optb Option[T]) Option[T] {
249265
if o.some && !optb.some {
250266
return o

option/option_test.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ package option
22

33
import (
44
"fmt"
5-
"github.com/initdc/types/result"
6-
"github.com/stretchr/testify/assert"
75
"strconv"
86
"testing"
7+
8+
"github.com/initdc/types/result"
9+
"github.com/stretchr/testify/assert"
910
)
1011

1112
func TestSome(t *testing.T) {
@@ -267,6 +268,25 @@ func TestOrElse(t *testing.T) {
267268
assert.Equal(t, None[int]().OrElse(nobody), None[int]())
268269
}
269270

271+
func TestTryOr(t *testing.T) {
272+
f := func(x int) float32 { return float32(x) * 2 }
273+
x := Some(2)
274+
y := None[int]()
275+
276+
assert.Equal(t, TryOr(x, f, "bad"), result.Ok[float32, string](4.0))
277+
assert.Equal(t, TryOr(y, f, "bad"), result.Err[float32, string]("bad"))
278+
}
279+
280+
func TestTryOrElse(t *testing.T) {
281+
f := func(x int) float32 { return float32(x) * 2 }
282+
closure := func() result.Result[float32, string] { return result.Err[float32, string]("bad") }
283+
x := Some(2)
284+
y := None[int]()
285+
286+
assert.Equal(t, TryOrElse(x, f, closure), result.Ok[float32, string](4.0))
287+
assert.Equal(t, TryOrElse(y, f, closure), result.Err[float32, string]("bad"))
288+
}
289+
270290
func TestXor(t *testing.T) {
271291
x := Some(2)
272292
y := None[int]()

0 commit comments

Comments
 (0)