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] }