An Algebraic Effect System for Golang.

Stop resume function takes no arguments

+11 -11
+11 -11
fx.go
··· 3 3 type Fx[S, V any] struct { 4 4 imm func() V 5 5 sus func(S) Fx[S, V] 6 - stp func(any) Fx[S, V] 6 + stp func() Fx[S, V] 7 7 } 8 8 9 9 type FxPure[V any] = Fx[Nil, V] ··· 31 31 32 32 // An stopped effect that panics if restarted 33 33 func Halt[S, V any]() Fx[S, V] { 34 - return Stop(func(x any) Fx[S, V] { 34 + return Stop(func() Fx[S, V] { 35 35 panic("tried to restart halted effect. try using fx.Replace instead") 36 36 }) 37 37 } 38 38 39 - func Stop[S, V any](f func(any) Fx[S, V]) Fx[S, V] { return Fx[S, V]{stp: f} } 39 + func Stop[S, V any](f func() Fx[S, V]) Fx[S, V] { return Fx[S, V]{stp: f} } 40 40 41 41 // Replace with y if x is already stopped. Otherwise x continues. 42 42 func Replace[S, V any](y func() Fx[S, V]) func(Fx[S, V]) Fx[S, V] { ··· 55 55 func Cont[T, U, S, V any](cmap func(T) S, fmap func(V) Fx[T, U]) func(Fx[S, V]) Fx[T, U] { 56 56 return func(e Fx[S, V]) Fx[T, U] { 57 57 if e.stp != nil { 58 - return Stop(func(x any) Fx[T, U] { 59 - return Cont(cmap, fmap)(e.stp(x)) 58 + return Stop(func() Fx[T, U] { 59 + return Cont(cmap, fmap)(e.stp()) 60 60 }) 61 61 } 62 62 if e.imm != nil { ··· 89 89 func ContraMap[V, S, R any](f func(R) S) func(Fx[S, V]) Fx[R, V] { 90 90 return func(e Fx[S, V]) Fx[R, V] { 91 91 if e.stp != nil { 92 - return Stop(func(x any) Fx[R, V] { 93 - return ContraMap[V](f)(e.stp(x)) 92 + return Stop(func() Fx[R, V] { 93 + return ContraMap[V](f)(e.stp()) 94 94 }) 95 95 } 96 96 if e.imm != nil { ··· 172 172 173 173 func ProvideLeft[A, B, V any](e Fx[And[A, B], V], a A) Fx[B, V] { 174 174 if e.stp != nil { 175 - return Stop(func(x any) Fx[B, V] { 176 - return ProvideLeft(e.stp(x), a) 175 + return Stop(func() Fx[B, V] { 176 + return ProvideLeft(e.stp(), a) 177 177 }) 178 178 } 179 179 if e.imm != nil { ··· 186 186 for { 187 187 e = e.sus(ab) 188 188 if e.stp != nil { 189 - return Stop(func(x any) Fx[B, V] { 190 - return loop(e.stp(x)) 189 + return Stop(func() Fx[B, V] { 190 + return loop(e.stp()) 191 191 }) 192 192 } 193 193 if e.imm != nil {