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
more
oeiuwq.com
10 months ago
fb0a544f
29fe1ff8
+15
-25
1 changed file
expand all
collapse all
unified
split
fx.go
+15
-25
fx.go
···
15
15
var PNil Nil = Nil(pnil{})
16
16
var PureNil FxNil = Pure(PNil)
17
17
18
18
-
func Pure[V any](v V) FxPure[V] {
19
19
-
return Const[Nil](v)
20
20
-
}
18
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
24
-
func Const[S, V any](v V) Fx[S, V] {
25
25
-
return Fx[S, V]{imm: func() V { return v }}
26
26
-
}
22
22
+
func Const[S, V any](v V) Fx[S, V] { return Fx[S, V]{imm: func() V { return v }} }
27
23
28
28
-
func Pending[S, V any](f func(S) Fx[S, V]) Fx[S, V] {
29
29
-
return Fx[S, V]{sus: f}
30
30
-
}
24
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
36
-
func Apply[F ~func(I) O, I, O any](i I) Fx[F, O] {
37
37
-
return Map(Ctx[F](), func(f F) O { return f(i) })
38
38
-
}
39
39
-
40
40
-
func Ctx[V any]() Fx[V, V] {
41
41
-
return Func(identity[V])
42
42
-
}
30
30
+
func Ctx[V any]() Fx[V, V] { return Func(identity[V]) }
43
31
44
32
// An effect that will never be continued.
45
45
-
func Halt[S, V any]() Fx[S, V] {
46
46
-
return Fx[S, V]{hlt: func() {}}
47
47
-
}
33
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
77
-
func rswap[A, B any](ba And[B, A]) And[A, B] {
78
78
-
var ab And[A, B] = func() (A, B) {
79
79
-
b, a := ba()
80
80
-
return a, b
63
63
+
func swap[A, B any](ab And[A, B]) And[B, A] {
64
64
+
var ba And[B, A] = func() (B, A) {
65
65
+
a, b := ab()
66
66
+
return b, a
81
67
}
82
82
-
return ab
68
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
138
-
return Cont[And[B, A], V](rswap, Const)(e)
124
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
182
+
}
183
183
+
184
184
+
func Apply[F ~func(I) O, I, O any](i I) Fx[F, O] {
185
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] {