import type { Primitive } from "#/engine/lib/Primitive.ts"; export type Cache = { clear(): void; delete(key: unknown): boolean; get(key: unknown): T | undefined; has(key: unknown): boolean; set(key: unknown, value: T): unknown; }; export function withCache) => T>( fn: U, cache: Cache, ): (key: unknown, ...args: Parameters) => T { return (key, ...args) => { if (cache.has(key)) { return cache.get(key) as T; } const value = fn(...args); cache.set(key, value); return value; }; } export function memoize( fn: (arg: U) => T, ): [(arg: U) => T, Cache] { const cache = new Map(); const callback = withCache(fn, cache); return [ (arg) => { return callback(arg, arg); }, cache, ]; }