42 lines
768 B
Go
42 lines
768 B
Go
|
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]
|
||
|
}
|