improved mem & cpu consumption

This commit is contained in:
2024-08-22 11:54:57 +01:00
parent 938217dd64
commit 7fd9c030c0
10 changed files with 220 additions and 15 deletions

View File

@@ -3,6 +3,7 @@ package gubgub
import (
"context"
"fmt"
"iter"
"sync"
)
@@ -83,16 +84,7 @@ func (t *AsyncTopic[T]) run() {
break
}
keepers := make([]Subscriber[T], 0, len(subscribers))
for _, callback := range subscribers {
keep := callback(msg)
if keep {
keepers = append(keepers, callback)
}
}
subscribers = keepers
subscribers = sequentialDelivery(msg, subscribers)
}
}
}
@@ -131,6 +123,32 @@ func (t *AsyncTopic[T]) Subscribe(fn Subscriber[T]) error {
return nil
}
// Feed allows you to for/range to consume future published messages. The supporting subscriber will eventually be discarded after you exit the for loop.
func (t *AsyncTopic[T]) Feed() iter.Seq[T] {
feed := make(chan T, 1)
done := make(chan struct{})
t.Subscribe(func(msg T) bool {
select {
case feed <- msg:
return true
case <-done:
close(feed)
return false
}
})
return func(yield func(T) bool) {
defer close(done)
for msg := range feed {
if !yield(msg) {
return
}
}
}
}
type AsyncTopicOptions struct {
onClose func()
onSubscribe func(count int)