major refactor to accommodate feed

This commit is contained in:
2024-09-09 11:22:00 +01:00
parent 4741acc016
commit a394dab041
9 changed files with 360 additions and 223 deletions

37
feed.go Normal file
View File

@@ -0,0 +1,37 @@
package gubgub
import "iter"
// Feed allows the usage of for/range to consume future published messages.
// The supporting subscriber will eventually be discarded after you exit the for loop.
func Feed[T any](t Subscribable[T], buffered bool) iter.Seq[T] {
feed := make(chan T) // closed by the subscriber
unsubscribe := make(chan struct{}) // closed by the iterator
subscriber := func(msg T) bool {
select {
case feed <- msg:
return true
case <-unsubscribe:
close(feed)
return false
}
}
if buffered {
subscriber = Buffered(subscriber)
}
t.Subscribe(subscriber)
// Iterator
return func(yield func(T) bool) {
defer close(unsubscribe)
for msg := range feed {
if !yield(msg) {
return
}
}
}
}