Not useful yet... I thought it would be but I changed my mind... Need to think about this a lot more
37 lines
785 B
Go
37 lines
785 B
Go
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
|
|
}
|
|
}
|
|
}
|