eventstore: SortedMerge() helper for combining results from different eventstores.

This commit is contained in:
fiatjaf
2025-10-30 11:42:04 -03:00
parent e34ce6aa94
commit 20f06d9608
2 changed files with 113 additions and 0 deletions

61
eventstore/combine.go Normal file
View File

@@ -0,0 +1,61 @@
package eventstore
import (
"iter"
"fiatjaf.com/nostr"
)
func SortedMerge(it1, it2 iter.Seq[nostr.Event]) iter.Seq[nostr.Event] {
next1, done1 := iter.Pull(it1)
next2, done2 := iter.Pull(it2)
return func(yield func(nostr.Event) bool) {
defer done1()
defer done2()
evt1, ok1 := next1()
evt2, ok2 := next2()
both:
if ok1 && ok2 {
if evt2.CreatedAt > evt1.CreatedAt {
if !yield(evt2) {
return
}
evt2, ok2 = next2()
goto both
} else {
if !yield(evt1) {
return
}
evt1, ok1 = next1()
goto both
}
}
if !ok2 {
only1:
if ok1 {
if !yield(evt1) {
return
}
evt1, ok1 = next1()
goto only1
}
}
if !ok1 {
only2:
if ok2 {
if !yield(evt2) {
return
}
evt2, ok2 = next2()
goto only2
}
}
return
}
}