import type {Decoding} from '../type/decoding.js'; import {isYield} from '../util/guard/is-yield.js'; import {BufferReaderController} from './buffer-reader-controller.js'; import type {BufferReaderGenerator} from './buffer-reader-generator.js'; import type {BufferSourceReaderFlush} from './buffer-source-reader-flush.js'; export class BufferSourceIterableReader { public static from( iterable: Iterable, ): BufferSourceIterableReader { return new BufferSourceIterableReader(iterable[Symbol.iterator]()); } readonly #controller = new BufferReaderController(); readonly #iterator: Iterator; public constructor(iterator: Iterator) { this.#iterator = iterator; } #handle(generator: BufferReaderGenerator): T { let result: IteratorResult = generator.next(); while (isYield(result)) { result = generator.next(this.#iterator.next()); } return result.value; } public final(flush?: boolean): void { // eslint-disable-next-line @typescript-eslint/no-invalid-void-type this.#handle(this.#controller.final(flush)); } public finalRead( decoding: Decoding, flush: BufferSourceReaderFlush = () => false, ): T { const result: T = this.read(decoding); this.final(flush(result)); return result; } public read(decoding: Decoding): T { return this.#handle(this.#controller.read(decoding)); } }