type Reader = Deno.Reader;
export class OneByteReader implements Reader { constructor(readonly r: Reader) {}
read(p: Uint8Array): Promise<number | null> { if (p.byteLength === 0) { return Promise.resolve(0); } if (!(p instanceof Uint8Array)) { throw Error("expected Uint8Array"); } return Promise.resolve(this.r.read(p.subarray(0, 1))); }}
export class HalfReader implements Reader { constructor(readonly r: Reader) {}
read(p: Uint8Array): Promise<number | null> { if (!(p instanceof Uint8Array)) { throw Error("expected Uint8Array"); } const half = Math.floor((p.byteLength + 1) / 2); return Promise.resolve(this.r.read(p.subarray(0, half))); }}
export class TimeoutReader implements Reader { count = 0; constructor(readonly r: Reader) {}
read(p: Uint8Array): Promise<number | null> { this.count++; if (this.count === 2) { throw new Deno.errors.TimedOut(); } return Promise.resolve(this.r.read(p)); }}