diff options
Diffstat (limited to 'std/io/readers.ts')
-rw-r--r-- | std/io/readers.ts | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/std/io/readers.ts b/std/io/readers.ts new file mode 100644 index 000000000..0208de413 --- /dev/null +++ b/std/io/readers.ts @@ -0,0 +1,42 @@ +// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. +type Reader = Deno.Reader; +import { encode } from "../strings/mod.ts"; + +/** Reader utility for strings */ +export class StringReader implements Reader { + private offs = 0; + private buf = new Uint8Array(encode(this.s)); + + constructor(private readonly s: string) {} + + async read(p: Uint8Array): Promise<number | Deno.EOF> { + const n = Math.min(p.byteLength, this.buf.byteLength - this.offs); + p.set(this.buf.slice(this.offs, this.offs + n)); + this.offs += n; + if (n === 0) { + return Deno.EOF; + } + return n; + } +} + +/** Reader utility for combining multiple readers */ +export class MultiReader implements Reader { + private readonly readers: Reader[]; + private currentIndex = 0; + + constructor(...readers: Reader[]) { + this.readers = readers; + } + + async read(p: Uint8Array): Promise<number | Deno.EOF> { + const r = this.readers[this.currentIndex]; + if (!r) return Deno.EOF; + const result = await r.read(p); + if (result === Deno.EOF) { + this.currentIndex++; + return 0; + } + return result; + } +} |