Implement a reactive value

Not useful yet... I thought it would be but I changed my mind...
Need to think about this a lot more
This commit is contained in:
2024-08-01 23:27:46 +02:00
parent 797e1f025b
commit e8b9eb934b

36
utils/reactivevalue.go Normal file
View File

@@ -0,0 +1,36 @@
package utils
type ReactiveValue[T any] struct {
V T
subscribers []chan *T
}
func NewReactiveValue[T any](value T) *ReactiveValue[T] {
return &ReactiveValue[T]{
V: value,
subscribers: make([]chan *T, 0),
}
}
func (rv *ReactiveValue[T]) Set(value T) {
rv.V = value
for _, subscriber := range rv.subscribers {
subscriber <- &value
}
}
func (rv *ReactiveValue[T]) Subscribe() chan *T {
subscriber := make(chan *T)
rv.subscribers = append(rv.subscribers, subscriber)
return subscriber
}
func (rv *ReactiveValue[T]) Unsubscribe(subscriber chan *T) {
for i, s := range rv.subscribers {
if s == subscriber {
rv.subscribers = append(rv.subscribers[:i], rv.subscribers[i+1:]...)
close(subscriber)
return
}
}
}