An Algebraic Effect System for Golang.

Two ways of provinding the abort handler

+5 -1
+3 -1
abort/abort_test.go
··· 11 11 type Err = string 12 12 value := 22 13 13 e := Succeed[Err](22) 14 + // Applying the handler directly 14 15 x := AbortHandler(e) 15 16 var r Result[Ok, Err] = fx.Eval(x) 16 17 val, err := r() ··· 28 29 e := fx.Map(Abort[Ok]("ahhhh"), func(_ Ok) int { 29 30 panic("BUG: mapping on aborted eff should be unreachable") 30 31 }) 31 - x := AbortHandler(e) 32 + // Another way of applying the abort handler. 33 + x := fx.ProvideLeft(fx.Handle[ResultHn[Ok, Err]](e), AbortHandler[Ok, Err]) 32 34 var r Result[Ok, Err] = fx.Eval(x) 33 35 val, err := r() 34 36 if *err != "ahhhh" {
+2
abort/result.go
··· 7 7 func success[V, E any](v V) Result[V, E] { return func() (*V, *E) { return &v, nil } } 8 8 func failure[V, E any](e E) Result[V, E] { return func() (*V, *E) { return nil, &e } } 9 9 10 + type ResultHn[V, E any] = func(AbortFx[E, V]) fx.FxPure[Result[V, E]] 11 + 10 12 func AbortHandler[V, E any](e AbortFx[E, V]) fx.FxPure[Result[V, E]] { 11 13 var err Result[V, E] 12 14 var abortFn AbortFn[E] = func(e E) fx.FxNil {