Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 1x 1x 1x 1x 34x 34x 34x 34x 34x 34x 34x 34x 34x 34x 34x 34x 34x 34x 30x 1x 1x 29x 29x 29x 29x 29x 2x 2x 29x 27x 5x 5x 5x 5x 27x 27x 27x 26x 26x 26x 27x 29x 30x 34x 34x 31x 1x 1x 30x 31x 5x 5x 5x 30x 30x 30x 34x 34x 23x 23x 34x | import EventEmitter from 'node:events' import { nlRegexp } from './regexp' export default class LineBuffer extends EventEmitter { lines: string[] #closed: boolean #partialLine: string constructor() { super() this.lines = [] this.#closed = false this.#partialLine = '' } append(data: string): void { if (this.#closed) { throw new Error('LineBuffer is closed') } if (data.length) { let appendLines = data.split(nlRegexp) if (appendLines.length === 1) { let [appendLine] = appendLines this.#partialLine = `${this.#partialLine}${appendLine}` } else { if (this.#partialLine) { let appendLine = `${this.#partialLine}${appendLines.shift()}` this.emit('line', appendLine) this.lines.push(appendLine) } this.#partialLine = appendLines.pop() as string for (let appendLine of appendLines) { this.emit('line', appendLine) this.lines.push(appendLine) } } } } close(): void { if (this.#closed) { throw new Error('LineBuffer is closed') } if (this.#partialLine) { this.emit('line', this.#partialLine) this.lines.push(this.#partialLine) } this.#closed = true } toString(): string { return this.lines.join('\n') } } |