Skip to content

Commit 58c55c5

Browse files
committed
cache the dictionary
1 parent d505a36 commit 58c55c5

1 file changed

Lines changed: 42 additions & 34 deletions

File tree

src/dictionary/parallel_parser.ts

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18,45 +18,53 @@ class ParserWorker {
1818
new URL("./worker.ts", import.meta.url),
1919
{ type: "module" },
2020
);
21+
#cachedSource = "";
22+
#cachedDictionary: Dictionary = new Map();
2123
[Symbol.dispose]() {
2224
this.#worker.terminate();
2325
}
2426
parse(position: number, source: string): Promise<Dictionary> {
25-
return new Promise((resolve, reject) => {
26-
const messageCallback = (event: MessageEvent) => {
27-
const result = event.data as Result;
28-
switch (result.type) {
29-
case "value":
30-
resolve(result.value);
31-
break;
32-
case "error":
33-
reject(
34-
new AggregateError(
35-
result.error.map((result) =>
36-
new PositionedError(result.message, {
37-
position: mapNullable(
38-
result.position,
39-
({ position: offsetPosition, length }) => ({
40-
position: position + offsetPosition,
41-
length,
42-
}),
43-
) ?? undefined,
44-
})
27+
if (this.#cachedSource === source) {
28+
return Promise.resolve(this.#cachedDictionary);
29+
} else {
30+
return new Promise((resolve, reject) => {
31+
const messageCallback = (event: MessageEvent) => {
32+
const result = event.data as Result;
33+
switch (result.type) {
34+
case "value":
35+
resolve(result.value);
36+
this.#cachedSource = source;
37+
this.#cachedDictionary = result.value;
38+
break;
39+
case "error":
40+
reject(
41+
new AggregateError(
42+
result.error.map((result) =>
43+
new PositionedError(result.message, {
44+
position: mapNullable(
45+
result.position,
46+
({ position: offsetPosition, length }) => ({
47+
position: position + offsetPosition,
48+
length,
49+
}),
50+
) ?? undefined,
51+
})
52+
),
4553
),
46-
),
47-
);
48-
break;
49-
}
50-
this.#worker.removeEventListener("message", messageCallback);
51-
};
52-
this.#worker.addEventListener("message", messageCallback);
53-
const errorCallback = (event: ErrorEvent) => {
54-
reject(event.error);
55-
this.#worker.removeEventListener("error", errorCallback);
56-
};
57-
this.#worker.addEventListener("error", errorCallback);
58-
this.#worker.postMessage(source);
59-
});
54+
);
55+
break;
56+
}
57+
this.#worker.removeEventListener("message", messageCallback);
58+
};
59+
this.#worker.addEventListener("message", messageCallback);
60+
const errorCallback = (event: ErrorEvent) => {
61+
reject(event.error);
62+
this.#worker.removeEventListener("error", errorCallback);
63+
};
64+
this.#worker.addEventListener("error", errorCallback);
65+
this.#worker.postMessage(source);
66+
});
67+
}
6068
}
6169
}
6270
export class Parser {

0 commit comments

Comments
 (0)