naive/effect.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]
}