▶1function mergeKStreams(streams, key) {2 // Only the k heads live in the heap, never the whole feed.3 const heads = new Heap((a, b) => a.key - b.key);4 for (let i = 0; i < streams.length; i++) {5 const first = streams[i][0];6 if (first !== undefined) {7 heads.push({ key: key(first), stream: i, pos: 0 });8 }9 }1011 const merged = [];12 for (;;) {13 const head = heads.pop(); // smallest of the k heads14 if (head === undefined) break; // every stream exhausted1516 merged.push(streams[head.stream][head.pos]);1718 const next = streams[head.stream][head.pos + 1];19 if (next !== undefined) {20 heads.push({ key: key(next), stream: head.stream, pos: head.pos + 1 });21 }22 }23 return merged;24}
Call stack & variables
| streams | { github: [ 1, 4, 9, 11 ], jira: [ 2, 6, 12 ], cursor: [ 3, 5, 8, 14 ], anthropic: [ 7, 10, 13 ] } |
| heads | [] |