An Algebraic Effect System for Golang.

more

+15 -25
+15 -25
fx.go
··· 15 15 var PNil Nil = Nil(pnil{}) 16 16 var PureNil FxNil = Pure(PNil) 17 17 18 - func Pure[V any](v V) FxPure[V] { 19 - return Const[Nil](v) 20 - } 18 + func Pure[V any](v V) FxPure[V] { return Const[Nil](v) } 21 19 22 20 func identity[V any](v V) V { return v } 23 21 24 - func Const[S, V any](v V) Fx[S, V] { 25 - return Fx[S, V]{imm: func() V { return v }} 26 - } 22 + func Const[S, V any](v V) Fx[S, V] { return Fx[S, V]{imm: func() V { return v }} } 27 23 28 - func Pending[S, V any](f func(S) Fx[S, V]) Fx[S, V] { 29 - return Fx[S, V]{sus: f} 30 - } 24 + func Pending[S, V any](f func(S) Fx[S, V]) Fx[S, V] { return Fx[S, V]{sus: f} } 31 25 32 26 func Func[S, V any](f func(S) V) Fx[S, V] { 33 27 return Pending(func(s S) Fx[S, V] { return Const[S](f(s)) }) 34 28 } 35 29 36 - func Apply[F ~func(I) O, I, O any](i I) Fx[F, O] { 37 - return Map(Ctx[F](), func(f F) O { return f(i) }) 38 - } 39 - 40 - func Ctx[V any]() Fx[V, V] { 41 - return Func(identity[V]) 42 - } 30 + func Ctx[V any]() Fx[V, V] { return Func(identity[V]) } 43 31 44 32 // An effect that will never be continued. 45 - func Halt[S, V any]() Fx[S, V] { 46 - return Fx[S, V]{hlt: func() {}} 47 - } 33 + func Halt[S, V any]() Fx[S, V] { return Fx[S, V]{hlt: func() {}} } 48 34 49 35 // Replace with y if x is already Halted. Otherwise x continues. 50 36 func Replace[S, V any](y func() Fx[S, V]) func(Fx[S, V]) Fx[S, V] { ··· 74 60 75 61 type And[A, B any] func() (A, B) 76 62 77 - func rswap[A, B any](ba And[B, A]) And[A, B] { 78 - var ab And[A, B] = func() (A, B) { 79 - b, a := ba() 80 - return a, b 63 + func swap[A, B any](ab And[A, B]) And[B, A] { 64 + var ba And[B, A] = func() (B, A) { 65 + a, b := ab() 66 + return b, a 81 67 } 82 - return ab 68 + return ba 83 69 } 84 70 85 71 func left[A, B any](ab And[A, B]) A { ··· 135 121 } 136 122 137 123 func AndSwap[A, B, V any](e Fx[And[A, B], V]) Fx[And[B, A], V] { 138 - return Cont[And[B, A], V](rswap, Const)(e) 124 + return Cont[And[B, A], V](swap[B, A], Const)(e) 139 125 } 140 126 141 127 func AndJoin[A, B, V any](e Fx[A, Fx[B, V]]) Fx[And[A, B], V] { ··· 193 179 } 194 180 } 195 181 }) 182 + } 183 + 184 + func Apply[F ~func(I) O, I, O any](i I) Fx[F, O] { 185 + return Map(Ctx[F](), func(f F) O { return f(i) }) 196 186 } 197 187 198 188 func Suspend[A ~func(I) Fx[B, O], B, I, O any](i I) Fx[And[A, B], O] {