1
0
Fork 0
mirror of https://git.sr.ht/~ashkeel/strimertul synced 2024-09-20 02:00:49 +00:00
strimertul/utils/pubsub.go

34 lines
694 B
Go
Raw Normal View History

2022-11-30 18:15:47 +00:00
package utils
import "git.sr.ht/~hamcha/containers"
type PubSub[T Comparable] struct {
subscribers *containers.RWSync[[]T]
}
func NewPubSub[T Comparable]() *PubSub[T] {
return &PubSub[T]{
subscribers: containers.NewRWSync([]T{}),
}
}
func (p *PubSub[T]) Subscribe(handler T) {
p.subscribers.Set(append(p.subscribers.Get(), handler))
}
func (p *PubSub[T]) Unsubscribe(handler T) {
arr := p.subscribers.Get()
// Use slice trick to in-place remove entry if found
for index := range arr {
if arr[index].Equals(handler) {
arr[index] = arr[len(arr)-1]
p.subscribers.Set(arr[:len(arr)-1])
return
}
}
}
func (p *PubSub[T]) Subscribers() []T {
return p.subscribers.Get()
}