From e8b9eb934b380ca97241fa7a6df41b21e1ba5bae Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Thu, 1 Aug 2024 23:27:46 +0200 Subject: [PATCH] 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 --- utils/reactivevalue.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 utils/reactivevalue.go diff --git a/utils/reactivevalue.go b/utils/reactivevalue.go new file mode 100644 index 0000000..29fcff7 --- /dev/null +++ b/utils/reactivevalue.go @@ -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 + } + } +}