Skip to content

Commit a88db48

Browse files
committed
refactor: type Result change initialize behavior
1 parent dcaafb1 commit a88db48

File tree

2 files changed

+37
-36
lines changed

2 files changed

+37
-36
lines changed

result/result.go

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ type Result[T, E any] struct {
1111
assigned bool
1212
}
1313

14-
func Ok[T, E any](v T) Result[T, E] {
15-
return Result[T, E]{
14+
func Ok[T, E any](v T) *Result[T, E] {
15+
return &Result[T, E]{
1616
value: v,
1717
ok: true,
1818
assigned: true,
1919
}
2020
}
2121

22-
func Err[T, E any](e E) Result[T, E] {
23-
return Result[T, E]{
22+
func Err[T, E any](e E) *Result[T, E] {
23+
return &Result[T, E]{
2424
err: e,
2525
ok: false,
2626
assigned: true,
@@ -57,7 +57,7 @@ func (r Result[T, E]) IsOk() bool {
5757
return r.ok
5858
}
5959

60-
func (r Result[T, E]) IsOkAnd(f func(T) bool) bool {
60+
func (r *Result[T, E]) IsOkAnd(f func(T) bool) bool {
6161
if !r.ok {
6262
return false
6363
}
@@ -68,144 +68,145 @@ func (r Result[T, E]) IsErr() bool {
6868
return !r.ok
6969
}
7070

71-
func (r Result[T, E]) IsErrAnd(f func(E) bool) bool {
71+
func (r *Result[T, E]) IsErrAnd(f func(E) bool) bool {
7272
if r.ok {
7373
return false
7474
}
7575
return f(r.err)
7676
}
7777

78-
func Map[T, E, U any](r Result[T, E], f func(T) U) Result[U, E] {
78+
func Map[T, E, U any](r *Result[T, E], f func(T) U) *Result[U, E] {
7979
if r.ok {
8080
return Ok[U, E](f(r.value))
8181
}
8282
return Err[U, E](r.err)
8383
}
8484

85-
func MapOr[T, E, U any](r Result[T, E], def U, f func(T) U) U {
85+
func MapOr[T, E, U any](r *Result[T, E], def U, f func(T) U) U {
8686
if r.ok {
8787
return f(r.value)
8888
}
8989
return def
9090
}
9191

92-
func MapOrElse[T, E, U any](r Result[T, E], def func(E) U, f func(T) U) U {
92+
func MapOrElse[T, E, U any](r *Result[T, E], def func(E) U, f func(T) U) U {
9393
if r.ok {
9494
return f(r.value)
9595
}
9696
return def(r.err)
9797
}
9898

99-
func MapOrDefault[T, E, U any](r Result[T, E], f func(T) U) U {
99+
func MapOrDefault[T, E, U any](r *Result[T, E], f func(T) U) U {
100100
if r.ok {
101101
return f(r.value)
102102
}
103103
var zero U
104104
return zero
105105
}
106106

107-
func MapErr[T, E, F any](r Result[T, E], f func(E) F) Result[T, F] {
107+
func MapErr[T, E, F any](r *Result[T, E], f func(E) F) *Result[T, F] {
108108
if r.ok {
109109
return Ok[T, F](r.value)
110110
}
111111
return Err[T, F](f(r.err))
112112
}
113113

114-
func (r Result[T, E]) Inspect(f func(T)) Result[T, E] {
114+
func (r *Result[T, E]) Inspect(f func(T)) *Result[T, E] {
115115
if r.ok {
116116
f(r.value)
117117
}
118118
return r
119119
}
120120

121-
func (r Result[T, E]) InspectErr(f func(E)) Result[T, E] {
121+
func (r *Result[T, E]) InspectErr(f func(E)) *Result[T, E] {
122122
if !r.ok {
123123
f(r.err)
124124
}
125125
return r
126126
}
127127

128-
func (r Result[T, E]) Expect(msg string) T {
128+
func (r *Result[T, E]) Expect(msg string) T {
129129
if r.ok {
130130
return r.value
131131
}
132132
panic(fmt.Sprintf("%s: %v", msg, r.err))
133133
}
134134

135-
func (r Result[T, E]) Unwrap() T {
135+
func (r *Result[T, E]) Unwrap() T {
136136
if r.ok {
137137
return r.value
138138
}
139139
panic(fmt.Sprintf("called Result.Unwrap() on an Err value: %v", r.err))
140140
}
141141

142-
func (r Result[T, E]) UnwrapOrDefault() T {
142+
func (r *Result[T, E]) UnwrapOrDefault() T {
143143
if r.ok {
144144
return r.value
145145
}
146146
var zero T
147147
return zero
148148
}
149149

150-
func (r Result[T, E]) ExpectErr(msg string) E {
150+
func (r *Result[T, E]) ExpectErr(msg string) E {
151151
if r.ok {
152152
panic(fmt.Sprintf("%s: %v", msg, r.value))
153153
}
154154
return r.err
155155
}
156156

157-
func (r Result[T, E]) UnwrapErr() E {
157+
func (r *Result[T, E]) UnwrapErr() E {
158158
if r.ok {
159159
panic(fmt.Sprintf("called Result.UnwrapErr() on an Ok value: %v", r.value))
160160
}
161161
return r.err
162162
}
163163

164-
func And[T, E, U any](r Result[T, E], res Result[U, E]) Result[U, E] {
164+
func And[T, E, U any](r *Result[T, E], res *Result[U, E]) *Result[U, E] {
165165
if r.ok {
166166
return res
167167
}
168168
return Err[U, E](r.err)
169169
}
170170

171-
func AndThen[T, E, U any](r Result[T, E], op func(T) Result[U, E]) Result[U, E] {
171+
func AndThen[T, E, U any](r *Result[T, E], op func(T) *Result[U, E]) *Result[U, E] {
172172
if r.ok {
173173
return op(r.value)
174174
}
175175
return Err[U, E](r.err)
176176
}
177177

178-
func Or[T, E, F any](r Result[T, E], res Result[T, F]) Result[T, F] {
178+
func Or[T, E, F any](r *Result[T, E], res *Result[T, F]) *Result[T, F] {
179179
if r.ok {
180180
return Ok[T, F](r.value)
181181
}
182182
return res
183183
}
184184

185-
func OrElse[T, E, F any](r Result[T, E], op func(E) Result[T, F]) Result[T, F] {
185+
func OrElse[T, E, F any](r *Result[T, E], op func(E) *Result[T, F]) *Result[T, F] {
186186
if r.ok {
187187
return Ok[T, F](r.value)
188188
}
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] {
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] {
193193
if r.ok {
194194
return Ok[U, F](op(r.value))
195195
}
196196
closure(r.err)
197197
// unreachable
198+
fmt.Println("Result unreachable")
198199
return closure(r.err)
199200
}
200201

201-
func (r Result[T, E]) UnwrapOr(def T) T {
202+
func (r *Result[T, E]) UnwrapOr(def T) T {
202203
if r.ok {
203204
return r.value
204205
}
205206
return def
206207
}
207208

208-
func (r Result[T, E]) UnwrapOrElse(f func(E) T) T {
209+
func (r *Result[T, E]) UnwrapOrElse(f func(E) T) T {
209210
if r.ok {
210211
return r.value
211212
}

result/result_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ func TestOk(t *testing.T) {
2222
c := Ok[int, string](1)
2323

2424
assert.Equal(t, a, b)
25-
assert.Equal(t, a, c)
26-
assert.Equal(t, b, c)
25+
assert.Equal(t, a, *c)
26+
assert.Equal(t, b, *c)
2727
}
2828

2929
func TestErr(t *testing.T) {
@@ -39,8 +39,8 @@ func TestErr(t *testing.T) {
3939
c := Err[int, string]("error")
4040

4141
assert.Equal(t, a, b)
42-
assert.Equal(t, a, c)
43-
assert.Equal(t, b, c)
42+
assert.Equal(t, a, *c)
43+
assert.Equal(t, b, *c)
4444
}
4545

4646
func TestIsOk(t *testing.T) {
@@ -173,7 +173,7 @@ func TestUnwrap(t *testing.T) {
173173
}
174174

175175
func TestUnwrapOrDefault(t *testing.T) {
176-
parseYear := func(s string) Result[int, string] {
176+
parseYear := func(s string) *Result[int, string] {
177177
year, err := strconv.Atoi(s)
178178
if err != nil {
179179
return Err[int, string]("parseYear failed")
@@ -218,7 +218,7 @@ func TestAnd(t *testing.T) {
218218
}
219219

220220
func TestAndThen(t *testing.T) {
221-
sqThenToString := func(x int) Result[string, string] {
221+
sqThenToString := func(x int) *Result[string, string] {
222222
if x > 100 || x < 0 {
223223
return Err[string, string]("overflowed")
224224
}
@@ -255,8 +255,8 @@ func TestOr(t *testing.T) {
255255
}
256256

257257
func TestOrElse(t *testing.T) {
258-
sq := func(x int) Result[int, int] { return Ok[int, int](x * x) }
259-
err := func(x int) Result[int, int] { return Err[int, int](x) }
258+
sq := func(x int) *Result[int, int] { return Ok[int, int](x * x) }
259+
err := func(x int) *Result[int, int] { return Err[int, int](x) }
260260

261261
r := Ok[int, int](2)
262262
e := Err[int, int](3)
@@ -269,7 +269,7 @@ func TestOrElse(t *testing.T) {
269269

270270
func TestTry(t *testing.T) {
271271
f1 := func(x int) float32 { return float32(x) * 2 }
272-
closure := func(e rune) Result[float32, string] { return Err[float32, string](string(e)) }
272+
closure := func(e rune) *Result[float32, string] { return Err[float32, string](string(e)) }
273273

274274
r := Ok[int, rune](1)
275275
assert.Equal(t, Try(r, f1, closure), Ok[float32, string](2.0))
@@ -318,15 +318,15 @@ func TestResultWithComplexTypes(t *testing.T) {
318318

319319
func TestChainedOperations(t *testing.T) {
320320
// 测试链式操作
321-
parse := func(s string) Result[int, string] {
321+
parse := func(s string) *Result[int, string] {
322322
i, err := strconv.Atoi(s)
323323
if err != nil {
324324
return Err[int, string]("invalid number")
325325
}
326326
return Ok[int, string](i)
327327
}
328328

329-
double := func(x int) Result[int, string] {
329+
double := func(x int) *Result[int, string] {
330330
if x > 100 {
331331
return Err[int, string]("too large")
332332
}

0 commit comments

Comments
 (0)