eventstore: SortedMerge() helper for combining results from different eventstores.
This commit is contained in:
61
eventstore/combine.go
Normal file
61
eventstore/combine.go
Normal 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user