tangled
alpha
login
or
join now
oeiuwq.com
/
fx.go
0
fork
atom
An Algebraic Effect System for Golang.
0
fork
atom
overview
issues
pulls
pipelines
Stop resume function takes no arguments
oeiuwq.com
10 months ago
89fc71f9
55fbe920
+11
-11
1 changed file
expand all
collapse all
unified
split
fx.go
+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
6
-
stp func(any) Fx[S, V]
6
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
34
-
return Stop(func(x any) Fx[S, V] {
34
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
39
-
func Stop[S, V any](f func(any) Fx[S, V]) Fx[S, V] { return Fx[S, V]{stp: f} }
39
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
58
-
return Stop(func(x any) Fx[T, U] {
59
59
-
return Cont(cmap, fmap)(e.stp(x))
58
58
+
return Stop(func() Fx[T, U] {
59
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
92
-
return Stop(func(x any) Fx[R, V] {
93
93
-
return ContraMap[V](f)(e.stp(x))
92
92
+
return Stop(func() Fx[R, V] {
93
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
175
-
return Stop(func(x any) Fx[B, V] {
176
176
-
return ProvideLeft(e.stp(x), a)
175
175
+
return Stop(func() Fx[B, V] {
176
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
189
-
return Stop(func(x any) Fx[B, V] {
190
190
-
return loop(e.stp(x))
189
189
+
return Stop(func() Fx[B, V] {
190
190
+
return loop(e.stp())
191
191
})
192
192
}
193
193
if e.imm != nil {