summaryrefslogtreecommitdiff
path: root/js/xeval.ts
diff options
context:
space:
mode:
authorNayeem Rahman <muhammed.9939@gmail.com>2019-10-04 14:02:36 +0100
committerRyan Dahl <ry@tinyclouds.org>2019-10-04 09:02:36 -0400
commiteecb4fea26aa3d1cddef1bb44ed3500d2b4dd477 (patch)
tree438c101d048007ea7d2ce89ce65f958cd3b58a8e /js/xeval.ts
parent403bdfc3ec258a0dd3a5d03391d3dc32648f2bbe (diff)
Use xeval from deno_std (#3058)
Diffstat (limited to 'js/xeval.ts')
-rw-r--r--js/xeval.ts109
1 files changed, 0 insertions, 109 deletions
diff --git a/js/xeval.ts b/js/xeval.ts
deleted file mode 100644
index 29adcbcaf..000000000
--- a/js/xeval.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-import { Buffer, writeAll } from "./buffer.ts";
-import { stdin } from "./files.ts";
-import { TextEncoder, TextDecoder } from "./text_encoding.ts";
-import { Reader, EOF } from "./io.ts";
-
-export type XevalFunc = (v: string) => void;
-
-// Generate longest proper prefix which is also suffix array.
-function createLPS(pat: Uint8Array): Uint8Array {
- const lps = new Uint8Array(pat.length);
- lps[0] = 0;
- let prefixEnd = 0;
- let i = 1;
- while (i < lps.length) {
- if (pat[i] == pat[prefixEnd]) {
- prefixEnd++;
- lps[i] = prefixEnd;
- i++;
- } else if (prefixEnd === 0) {
- lps[i] = 0;
- i++;
- } else {
- prefixEnd = pat[prefixEnd - 1];
- }
- }
- return lps;
-}
-
-// TODO(kevinkassimo): Move this utility to deno_std.
-// Import from there once doable.
-// Read from reader until EOF and emit string chunks separated
-// by the given delimiter.
-async function* chunks(
- reader: Reader,
- delim: string
-): AsyncIterableIterator<string> {
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
- // Avoid unicode problems
- const delimArr = encoder.encode(delim);
- const delimLen = delimArr.length;
- const delimLPS = createLPS(delimArr);
-
- let inputBuffer = new Buffer();
- const inspectArr = new Uint8Array(Math.max(1024, delimLen + 1));
-
- // Modified KMP
- let inspectIndex = 0;
- let matchIndex = 0;
- while (true) {
- const result = await reader.read(inspectArr);
- if (result === EOF) {
- // Yield last chunk.
- const lastChunk = inputBuffer.toString();
- yield lastChunk;
- return;
- }
- if ((result as number) < 0) {
- // Discard all remaining and silently fail.
- return;
- }
- const sliceRead = inspectArr.subarray(0, result as number);
- await writeAll(inputBuffer, sliceRead);
-
- let sliceToProcess = inputBuffer.bytes();
- while (inspectIndex < sliceToProcess.length) {
- if (sliceToProcess[inspectIndex] === delimArr[matchIndex]) {
- inspectIndex++;
- matchIndex++;
- if (matchIndex === delimLen) {
- // Full match
- const matchEnd = inspectIndex - delimLen;
- const readyBytes = sliceToProcess.subarray(0, matchEnd);
- // Copy
- const pendingBytes = sliceToProcess.slice(inspectIndex);
- const readyChunk = decoder.decode(readyBytes);
- yield readyChunk;
- // Reset match, different from KMP.
- sliceToProcess = pendingBytes;
- inspectIndex = 0;
- matchIndex = 0;
- }
- } else {
- if (matchIndex === 0) {
- inspectIndex++;
- } else {
- matchIndex = delimLPS[matchIndex - 1];
- }
- }
- }
- // Keep inspectIndex and matchIndex.
- inputBuffer = new Buffer(sliceToProcess);
- }
-}
-
-export async function xevalMain(
- xevalFunc: XevalFunc,
- delim_: string | null
-): Promise<void> {
- if (!delim_) {
- delim_ = "\n";
- }
- for await (const chunk of chunks(stdin, delim_)) {
- // Ignore empty chunks.
- if (chunk.length > 0) {
- xevalFunc(chunk);
- }
- }
-}