Skip to content

Commit 88ee12c

Browse files
committed
Split Abort and Result
1 parent a9e48ba commit 88ee12c

8 files changed

Lines changed: 68 additions & 73 deletions

File tree

abort/abort.go

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,16 @@ package abort
22

33
import fx "github.com/vic/fx.go"
44

5-
type Result[V, E any] func() (*V, *E)
5+
type AbortFn[E any] func(E) fx.FxNil
6+
type AbortAb[E any] = fx.And[AbortFn[E], fx.Nil]
7+
type AbortFx[E, V any] = fx.Fx[AbortAb[E], V]
68

7-
func success[V, E any](v V) Result[V, E] { return func() (*V, *E) { return &v, nil } }
8-
func failure[V, E any](e E) Result[V, E] { return func() (*V, *E) { return nil, &e } }
9-
10-
type AbortFn[V, E any] = func(E) fx.FxPure[V]
11-
type AbortHn[V, E any] = func(fx.Fx[fx.And[AbortFn[V, E], fx.Nil], V]) fx.FxPure[Result[V, E]]
12-
type AbortAb[V, E any] = fx.And[AbortFn[V, E], fx.Nil]
13-
type AbortFx[V, E, U any] = fx.Fx[AbortAb[V, E], U]
14-
15-
func Abort[V, E any](e E) AbortFx[V, E, V] {
16-
return fx.Suspend[AbortFn[V, E]](e)
17-
}
18-
19-
func Succeed[E, V any](v V) AbortFx[V, E, V] {
20-
return fx.Map(fx.Ctx[AbortAb[V, E]](), func(_ AbortAb[V, E]) V {
21-
return v
9+
func Abort[V, E any](e E) AbortFx[E, V] {
10+
return fx.Map(fx.Handle[AbortFn[E]](e), func(_ fx.Nil) V {
11+
panic("BUG: unreachable after aborted effect")
2212
})
2313
}
2414

25-
func Handler[V, E any]() AbortHn[V, E] {
26-
return func(eff fx.Fx[fx.And[AbortFn[V, E], fx.Nil], V]) fx.FxPure[Result[V, E]] {
27-
var err Result[V, E]
28-
handler := fx.Handler(func(e E) fx.FxPure[V] {
29-
err = failure[V](e)
30-
return fx.Halt[fx.Nil, V]()
31-
})
32-
succeeded := fx.Map(handler(eff), success[V, E])
33-
failed := func() fx.FxPure[Result[V, E]] { return fx.Pure(err) }
34-
return fx.Replace(failed)(succeeded)
35-
}
15+
func Succeed[E, V any](v V) AbortFx[E, V] {
16+
return fx.Const[AbortAb[E]](v)
3617
}

abort/abort_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ func TestSuccess(t *testing.T) {
1111
type Err = string
1212
value := 22
1313
e := Succeed[Err](22)
14-
h := Handler[Ok, Err]()
15-
x := fx.ProvideLeft(fx.Handle[AbortHn[Ok, Err]](e), h)
14+
x := fx.ProvideLeft(AbortResult(e), AbortHandler[Ok, Err])
1615
var r Result[Ok, Err] = fx.Eval(x)
1716
val, err := r()
1817
if err != nil {
@@ -29,8 +28,7 @@ func TestFailure(t *testing.T) {
2928
e := fx.Map(Abort[Ok]("ahhhh"), func(_ Ok) int {
3029
panic("BUG: mapping on aborted eff should be unreachable")
3130
})
32-
h := Handler[Ok, Err]()
33-
x := fx.ProvideLeft(fx.Handle[AbortHn[Ok, Err]](e), h)
31+
x := fx.ProvideLeft(AbortResult(e), AbortHandler[Ok, Err])
3432
var r Result[Ok, Err] = fx.Eval(x)
3533
val, err := r()
3634
if *err != "ahhhh" {

abort/result.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package abort
2+
3+
import fx "github.com/vic/fx.go"
4+
5+
type ResultFn[V, E any] func(AbortFx[E, V]) fx.FxPure[Result[V, E]]
6+
type ResultAb[V, E any] = fx.And[ResultFn[V, E], fx.Nil]
7+
type ResultFx[V, E any] = fx.Fx[ResultAb[V, E], Result[V, E]]
8+
9+
type Result[V, E any] func() (*V, *E)
10+
11+
func success[V, E any](v V) Result[V, E] { return func() (*V, *E) { return &v, nil } }
12+
func failure[V, E any](e E) Result[V, E] { return func() (*V, *E) { return nil, &e } }
13+
14+
func AbortResult[V, E any](eff AbortFx[E, V]) ResultFx[V, E] {
15+
return fx.Handle[ResultFn[V, E]](eff)
16+
}
17+
18+
func AbortHandler[V, E any](e AbortFx[E, V]) fx.FxPure[Result[V, E]] {
19+
var err Result[V, E]
20+
var abortFn AbortFn[E] = func(e E) fx.FxNil {
21+
err = failure[V](e)
22+
return fx.Halt[fx.Nil, fx.Nil]()
23+
}
24+
succeeded := fx.Map(fx.ProvideLeft(e, abortFn), success[V, E])
25+
failed := func() fx.FxPure[Result[V, E]] { return fx.Pure(err) }
26+
return fx.Replace(failed)(succeeded)
27+
}

fx.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -236,20 +236,20 @@ func Apply[F ~func(I) O, I, O any](i I) Fx[F, O] {
236236
return Map(Ctx[F](), func(f F) O { return f(i) })
237237
}
238238

239-
func Suspend[A ~func(I) Fx[B, O], B, I, O any](i I) Fx[And[A, B], O] {
240-
return FlatMap(Ctx[A](), func(a A) Fx[B, O] { return a(i) })
239+
func Const[S, V any](v V) Fx[S, V] {
240+
return Map(Ctx[S](), func(_ S) V { return v })
241241
}
242242

243-
func Handler[A ~func(I) Fx[B, O], B, I, O any](a A) func(Fx[And[A, B], O]) Fx[B, O] {
244-
return func(e Fx[And[A, B], O]) Fx[B, O] { return ProvideLeft(e, a) }
243+
func Handle[A ~func(I) Fx[B, O], B, I, O any](i I) Fx[And[A, B], O] {
244+
return AndJoin(Apply[A](i))
245245
}
246246

247-
func Handle[F ~func(Fx[A, U]) Fx[B, V], A, B, U, V any](e Fx[A, U]) Fx[And[F, B], V] {
248-
return FlatMap(Ctx[F](), func(f F) Fx[B, V] { return f(e) })
247+
func Handler[A ~func(I) Fx[B, O], B, I, O any](a A) func(Fx[And[A, B], O]) Fx[B, O] {
248+
return func(e Fx[And[A, B], O]) Fx[B, O] { return ProvideLeft(e, a) }
249249
}
250250

251-
func Request[F ~func(Fx[And[A, B], O]) Fx[B, O], A ~func(I) Fx[B, O], B, I, O any](i I) Fx[And[F, B], O] {
252-
return Handle[F](Suspend[A](i))
251+
func Suspend[F ~func(Fx[And[A, B], O]) Fx[B, O], A ~func(I) Fx[B, O], B, I, O any](i I) Fx[And[F, B], O] {
252+
return Handle[F](Handle[A](i))
253253
}
254254

255255
func Eval[V any](e Fx[Nil, V]) V {

fx_test.go

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package fx
22

33
import (
4+
"strconv"
45
"testing"
56
)
67

@@ -43,28 +44,21 @@ func TestApply(t *testing.T) {
4344
}
4445
}
4546

46-
type printRq = func(string) FxPure[int]
47-
type printHn = func(Fx[And[printRq, Nil], int]) Fx[Nil, int]
48-
type printAb = And[printHn, Nil]
49-
type printFx = Fx[printAb, int]
47+
type printFn = func(string) FxPure[int]
5048

51-
func PrintLn(line string) printFx {
52-
return Request[printHn](line)
49+
func PrintLn(line string) Fx[And[printFn, Nil], int] {
50+
return Handle[printFn](line)
5351
}
5452

55-
func dontPrintHandler() printHn {
56-
return Handler(func(line string) FxPure[int] {
57-
r := len(line)
58-
return Pure(r)
59-
})
53+
func printLn(line string) FxPure[int] {
54+
return Pure(len(line))
6055
}
6156

6257
func TestHandleSimple(t *testing.T) {
63-
e := PrintLn("hello")
64-
h := dontPrintHandler()
65-
f := ProvideLeft(e, h)
66-
v := Eval(f)
67-
if v != len("hello") {
58+
e := Map(PrintLn("hello"), strconv.Itoa)
59+
f := ProvideLeft(e, printLn)
60+
var v string = Eval(f)
61+
if v != strconv.Itoa(len("hello")) {
6862
t.Errorf("unexpected value %v", v)
6963
}
7064
}

rw/read.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,14 @@ import fx "github.com/vic/fx.go"
44

55
type Reader[T any] func() *T
66

7-
type ReadFn[T any] = func(fx.Nil) fx.FxPure[*T]
8-
type ReadHn[T any] = func(fx.Fx[fx.And[ReadFn[T], fx.Nil], *T]) fx.FxPure[*T]
9-
type ReadAb[T any] = fx.And[ReadHn[T], fx.Nil]
7+
type ReadFn[T any] func(fx.Nil) fx.FxPure[*T]
8+
type ReadAb[T any] = fx.And[ReadFn[T], fx.Nil]
109
type ReadFx[T, V any] = fx.Fx[ReadAb[T], V]
1110

1211
func Read[T any]() ReadFx[T, *T] {
13-
return fx.Request[ReadHn[T]](fx.PNil)
12+
return fx.Handle[ReadFn[T]](fx.PNil)
1413
}
1514

16-
func ReadHandler[T any](r Reader[T]) ReadHn[T] {
17-
return fx.Handler(func(_ fx.Nil) fx.FxPure[*T] {
18-
v := r()
19-
return fx.Pure(v)
20-
})
15+
func ReadService[T any](r Reader[T]) ReadFn[T] {
16+
return func(_ fx.Nil) fx.FxPure[*T] { return fx.Pure(r()) }
2117
}

rw/rw_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ func TestReadWrite(t *testing.T) {
1717
})
1818

1919
st := &S{"hello"}
20-
rh := ReadHandler(func() *S { return st })
21-
wh := WriteHandler(func(s *S) { st = s })
20+
rh := ReadService(func() *S { return st })
21+
wh := WriteService(func(s *S) { st = s })
2222
x := fx.AndCollapse(fx.ProvideAB(e, rh, wh))
2323
fx.Eval(x)
2424

rw/write.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,17 @@ import (
66

77
type Writer[T any] func(*T)
88

9-
type WriteFn[T any] = func(*T) fx.FxNil
10-
type WriteHn[T any] = func(fx.Fx[fx.And[WriteFn[T], fx.Nil], fx.Nil]) fx.FxNil
11-
type WriteAb[T any] = fx.And[WriteHn[T], fx.Nil]
9+
type WriteFn[T any] func(*T) fx.FxNil
10+
type WriteAb[T any] = fx.And[WriteFn[T], fx.Nil]
1211
type WriteFx[T, V any] = fx.Fx[WriteAb[T], V]
1312

1413
func Write[T any](v *T) WriteFx[T, fx.Nil] {
15-
return fx.Request[WriteHn[T]](v)
14+
return fx.Handle[WriteFn[T]](v)
1615
}
1716

18-
func WriteHandler[T any](w Writer[T]) WriteHn[T] {
19-
return fx.Handler(func(t *T) fx.FxNil {
17+
func WriteService[T any](w Writer[T]) WriteFn[T] {
18+
return func(t *T) fx.FxNil {
2019
w(t)
2120
return fx.PureNil
22-
})
21+
}
2322
}

0 commit comments

Comments
 (0)