froebel
Version:
TypeScript utility library
92 lines (91 loc) • 2.4 kB
TypeScript
import type { λ } from "./types";
/**
* Returns a copy of `fun` that remembers its result for any given arguments and
* only invokes `fun` for unknown arguments.
*
* The cache key is computed using the `key` function. The default `key`
* function simply stringifies the arguments.
*
* If `limit` is specified, only the `limit`-last entries are kept in cache.
*
* The function's cache is available at `memoized.cache`.
*
* If `opt.weak` is `true`, non-primitive cache keys are stored in a WeakMap.
* This behavior might for example be useful if you want to memoize some
* calculation including a DOM Node without holding on to a reference of that
* node.
* Using weak keys prohibits setting a `limit`.
*
* @param fun - The function to be memoized.
* @param opt - Optional additional parameters.
* @returns The memoized function.
*
* @example
* ```
* const expensiveCalculation = (a: number, b: number) => {
* console.log(`calculate ${a} + ${b}`)
* return a + b
* }
* const calc = memoize(expensiveCalculation)
*
* console.log( calc(1, 2) )
* // calculate 1 + 2
* // 3
* console.log( calc(20, 5) )
* // calculate 20 + 5
* // 25
* console.log( calc(20, 5) )
* // 25
* console.log( calc(1, 2) )
* // 3
*
* calc.cache.clear()
* console.log( calc(1, 2) )
* // calculate 1 + 2
* // 3
* ```
*
* @example
* ```
* const logIfDifferent = memoize(
* (msg: string) => console.log(msg),
* {
* limit: 1,
* key: msg => msg
* }
* )
*
* logIfDifferent('a')
* logIfDifferent('a')
* logIfDifferent('b')
* logIfDifferent('a')
*
* // a
* // b
* // a
* ```
*/
declare const memoize: <T extends λ<any[], any>, K = string, W extends boolean = false>(fun: T, opt?: {
/**
* How the cache key is computed. Defaults to `JSON.stringify`ing the arguments.
*/
key?: ((...args: Parameters<T>) => K) | undefined;
/**
* The maximum number of results that can be kept in cache before discarding the oldest result.
*/
limit?: number | undefined;
/**
* Store non-primitive cache keys in a WeakMap.
*/
weak?: W | undefined;
}) => T & {
cache: W extends false ? Map<K, ReturnType<T>> : Cache<K, ReturnType<T>>;
};
export default memoize;
declare class Cache<K, V> {
#private;
delete(key: K): boolean;
has(key: K): boolean;
get(key: K): V | undefined;
set(key: K, value: V): void;
}