47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
import { NostrEvent } from 'nostr-tools'
|
|
import { compareEvents } from './event'
|
|
|
|
export function mergeTimelines(timelines: NostrEvent[][], limit?: number) {
|
|
if (timelines.length === 0) return []
|
|
if (timelines.length === 1) return [...timelines[0]]
|
|
return timelines.reduce((merged, current) => _mergeTimelines(merged, current, limit), [])
|
|
}
|
|
|
|
function _mergeTimelines(a: NostrEvent[], b: NostrEvent[], limit?: number): NostrEvent[] {
|
|
if (a.length === 0) return [...b]
|
|
if (b.length === 0) return [...a]
|
|
|
|
const result: NostrEvent[] = []
|
|
let i = 0
|
|
let j = 0
|
|
while (i < a.length && j < b.length) {
|
|
const cmp = compareEvents(a[i], b[j])
|
|
if (cmp > 0) {
|
|
result.push(a[i])
|
|
i++
|
|
} else if (cmp < 0) {
|
|
result.push(b[j])
|
|
j++
|
|
} else {
|
|
result.push(a[i])
|
|
i++
|
|
j++
|
|
}
|
|
}
|
|
|
|
if (limit && result.length >= limit) {
|
|
return result
|
|
}
|
|
|
|
while (i < a.length && (!limit || result.length < limit)) {
|
|
result.push(a[i])
|
|
i++
|
|
}
|
|
|
|
while (j < b.length && (!limit || result.length < limit)) {
|
|
result.push(b[j])
|
|
j++
|
|
}
|
|
|
|
return result
|
|
}
|