Files
nage/engine/lib/cache.ts
T

36 lines
722 B
TypeScript

export type Cache<T> = {
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, U extends (...args: Parameters<U>) => T>(
fn: U,
cache: Cache<T>,
): (key: unknown, ...args: Parameters<U>) => 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<T, U>(fn: (arg: U) => T): [(arg: U) => T, Cache<T>] {
const cache = new Map<unknown, T>();
const callback = withCache(fn, cache);
return [
(arg) => {
return callback(arg, arg);
},
cache,
];
}