naive/effect.go

42 lines
768 B
Go
Raw Normal View History

2025-01-20 07:34:39 +01:00
package naive
import "fmt"
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() string {
return fmt.Sprintf("%v", 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]
}