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:
36
utils/reactivevalue.go
Normal file
36
utils/reactivevalue.go
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user