40 lines
730 B
Go
40 lines
730 B
Go
package naive
|
|
|
|
type Effect[T any] struct {
|
|
value T
|
|
listeners []func(newValue T)
|
|
}
|
|
|
|
var effects []interface{ clearListeners() }
|
|
|
|
func clearAllEffectListeners() {
|
|
for _, eff := range effects {
|
|
eff.clearListeners()
|
|
}
|
|
}
|
|
|
|
func UseEffect[T any](value T) *Effect[T] {
|
|
eff := &Effect[T]{value, nil}
|
|
effects = append(effects, eff)
|
|
return eff
|
|
}
|
|
|
|
func (eff *Effect[T]) Value() T {
|
|
return eff.value
|
|
}
|
|
|
|
func (eff *Effect[T]) SetValue(newValue T) {
|
|
eff.value = newValue
|
|
for _, listener := range eff.listeners {
|
|
listener(newValue)
|
|
}
|
|
}
|
|
|
|
func (eff *Effect[T]) OnChange(listener func(newValue T)) {
|
|
eff.listeners = append(eff.listeners, listener)
|
|
}
|
|
|
|
func (eff *Effect[T]) clearListeners() {
|
|
eff.listeners = eff.listeners[:0]
|
|
}
|