|
1 | 1 | import { assertGreater } from "@std/assert/greater";
|
2 |
| -import { assertLessOrEqual } from "@std/assert/less-or-equal"; |
3 |
| -import { MemoizationCacheResult, memoize } from "@std/cache/memoize"; |
| 2 | +import { memoize } from "@std/cache/memoize"; |
4 | 3 | import { ArrayResult, ArrayResultError } from "../array_result.ts";
|
5 | 4 |
|
6 | 5 | type Input = Readonly<{ source: string; position: number }>;
|
@@ -54,18 +53,18 @@ class SourceMemo<T> {
|
54 | 53 | export class Parser<T> {
|
55 | 54 | readonly rawParser: InnerParser<T>;
|
56 | 55 | constructor(parser: InnerParser<T>) {
|
57 |
| - this.rawParser = memoize< |
58 |
| - InnerParser<T>, |
59 |
| - Input, |
60 |
| - SourceMemo<MemoizationCacheResult<ParserResult<T>>> |
61 |
| - >( |
62 |
| - (input) => { |
63 |
| - // TODO: remove assertion |
64 |
| - assertLessOrEqual(input.position, input.source.length); |
65 |
| - return parser(input); |
66 |
| - }, |
67 |
| - { cache: new SourceMemo() }, |
68 |
| - ); |
| 56 | + // Turns out @std/[email protected] is buggy |
| 57 | + const cache: SourceMemo<ParserResult<T>> = new SourceMemo(); |
| 58 | + allMemo.add(new WeakRef(cache)); |
| 59 | + this.rawParser = (input) => { |
| 60 | + if (cache.has(input)) { |
| 61 | + return cache.get(input)!; |
| 62 | + } else { |
| 63 | + const result = parser(input); |
| 64 | + cache.set(input, result); |
| 65 | + return result; |
| 66 | + } |
| 67 | + }; |
69 | 68 | }
|
70 | 69 | generateParser(): (source: string) => ArrayResult<T> {
|
71 | 70 | return (input) => {
|
|
0 commit comments