Skip to content

Commit 45aaaba

Browse files
committed
feat: add Try() func to deal with Result type
1 parent 7f6642c commit 45aaaba

File tree

5 files changed

+69
-9
lines changed

5 files changed

+69
-9
lines changed

Rakefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,7 @@ end
1919
task :test_option do
2020
sh "go test -cover -v ./option"
2121
end
22+
23+
task :main do
24+
sh "go run main.go"
25+
end

e2e_test.go renamed to e2e/e2e_test.go

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

33
import (
44
"fmt"
5+
"testing"
6+
57
. "github.com/initdc/types/option"
68
. "github.com/initdc/types/result"
7-
"testing"
89
)
910

1011
func TestE2E(t *testing.T) {
@@ -16,7 +17,6 @@ func TestE2E(t *testing.T) {
1617

1718
n1 := None[int]()
1819

19-
2020
// Result
2121
var r1 Result[int, string]
2222
r1.Ok(1)

main.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
. "github.com/initdc/types/result"
8+
)
9+
10+
func Div(a, b int) Result[int, rune] {
11+
if b == 0 {
12+
return Err[int]('E')
13+
}
14+
return Ok[int, rune](a / b)
15+
}
16+
17+
func closure(r rune) Result[float32, string] {
18+
goto clean
19+
20+
clean:
21+
err := Err[float32](string(r))
22+
fmt.Printf("%#v\n", err)
23+
os.Exit(255)
24+
return err
25+
}
26+
27+
func main() {
28+
f1 := func(x int) float32 { return float32(x) * 2 }
29+
30+
r := Div(10, 0)
31+
fmt.Printf("%#v\n", Try(r, f1, closure))
32+
33+
e := Div(10, 2)
34+
fmt.Printf("%#v\n", Try(e, f1, closure))
35+
}

result/result.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ func (r *Result[T, E]) Err(e E) {
4646
}
4747

4848
func (r Result[T, E]) Valid() bool {
49-
return r.ok
49+
return r.ok
5050
}
5151

5252
func (r Result[T, E]) Assigned() bool {
53-
return r.assigned
53+
return r.assigned
5454
}
5555

5656
func (r Result[T, E]) IsOk() bool {
@@ -189,6 +189,15 @@ func OrElse[T, E, F any](r Result[T, E], op func(E) Result[T, F]) Result[T, F] {
189189
return op(r.err)
190190
}
191191

192+
func Try[T, E, U, F any](r Result[T, E], op func(T) U, closure func(E) Result[U, F]) Result[U, F] {
193+
if r.ok {
194+
return Ok[U, F](op(r.value))
195+
}
196+
closure(r.err)
197+
// unreachable
198+
return closure(r.err)
199+
}
200+
192201
func (r Result[T, E]) UnwrapOr(def T) T {
193202
if r.ok {
194203
return r.value

result/result_test.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ package result
33
import (
44
"errors"
55
"fmt"
6-
"github.com/stretchr/testify/assert"
76
"strconv"
87
"testing"
8+
9+
"github.com/stretchr/testify/assert"
910
)
1011

1112
func TestOk(t *testing.T) {
1213
var a = Result[int, string]{
13-
value: 1,
14-
ok: true,
14+
value: 1,
15+
ok: true,
1516
assigned: true,
1617
}
1718

@@ -27,8 +28,8 @@ func TestOk(t *testing.T) {
2728

2829
func TestErr(t *testing.T) {
2930
var a = Result[int, string]{
30-
err: "error",
31-
ok: false,
31+
err: "error",
32+
ok: false,
3233
assigned: true,
3334
}
3435

@@ -266,6 +267,17 @@ func TestOrElse(t *testing.T) {
266267
assert.Equal(t, OrElse(OrElse(e, err), err), Err[int, int](3))
267268
}
268269

270+
func TestTry(t *testing.T) {
271+
f1 := func(x int) float32 { return float32(x) * 2 }
272+
closure := func(e rune) Result[float32, string] { return Err[float32, string](string(e)) }
273+
274+
r := Ok[int, rune](1)
275+
assert.Equal(t, Try(r, f1, closure), Ok[float32, string](2.0))
276+
277+
e := Err[int, rune]('E')
278+
assert.Equal(t, Try(e, f1, closure), Err[float32, string]("E"))
279+
}
280+
269281
func TestUnwrapOr(t *testing.T) {
270282
r := Ok[int, string](9)
271283
assert.Equal(t, r.UnwrapOr(2), 9)

0 commit comments

Comments
 (0)