|
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