Bpistle/src/lib/timeline.ts
codytseng 89bb9ad2d0 feat: 💨
2026-01-02 02:53:29 +08:00

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
}