97 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| declare namespace mem {
 | |
| 	interface CacheStorage<KeyType extends unknown, ValueType extends unknown> {
 | |
| 		has(key: KeyType): boolean;
 | |
| 		get(key: KeyType): ValueType | undefined;
 | |
| 		set(key: KeyType, value: ValueType): void;
 | |
| 		delete(key: KeyType): void;
 | |
| 		clear?: () => void;
 | |
| 	}
 | |
| 
 | |
| 	interface Options<
 | |
| 		ArgumentsType extends unknown[],
 | |
| 		CacheKeyType extends unknown,
 | |
| 		ReturnType extends unknown
 | |
| 	> {
 | |
| 		/**
 | |
| 		Milliseconds until the cache expires.
 | |
| 
 | |
| 		@default Infinity
 | |
| 		*/
 | |
| 		readonly maxAge?: number;
 | |
| 
 | |
| 		/**
 | |
| 		Determines the cache key for storing the result based on the function arguments. By default, if there's only one argument and it's a [primitive](https://developer.mozilla.org/en-US/docs/Glossary/Primitive), it's used directly as a key, otherwise it's all the function arguments JSON stringified as an array.
 | |
| 
 | |
| 		You could for example change it to only cache on the first argument `x => JSON.stringify(x)`.
 | |
| 		*/
 | |
| 		readonly cacheKey?: (...arguments: ArgumentsType) => CacheKeyType;
 | |
| 
 | |
| 		/**
 | |
| 		Use a different cache storage. You could for example use a `WeakMap` instead or [`quick-lru`](https://github.com/sindresorhus/quick-lru) for a LRU cache.
 | |
| 
 | |
| 		@default new Map()
 | |
| 		*/
 | |
| 		readonly cache?: CacheStorage<CacheKeyType, {data: ReturnType; maxAge: number}>;
 | |
| 
 | |
| 		/**
 | |
| 		Cache rejected promises.
 | |
| 
 | |
| 		@default false
 | |
| 		*/
 | |
| 		readonly cachePromiseRejection?: boolean;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| declare const mem: {
 | |
| 	/**
 | |
| 	[Memoize](https://en.wikipedia.org/wiki/Memoization) functions - An optimization used to speed up consecutive function calls by caching the result of calls with identical input.
 | |
| 
 | |
| 	@param fn - Function to be memoized.
 | |
| 
 | |
| 	@example
 | |
| 	```
 | |
| 	import mem = require('mem');
 | |
| 
 | |
| 	let i = 0;
 | |
| 	const counter = () => ++i;
 | |
| 	const memoized = mem(counter);
 | |
| 
 | |
| 	memoized('foo');
 | |
| 	//=> 1
 | |
| 
 | |
| 	// Cached as it's the same arguments
 | |
| 	memoized('foo');
 | |
| 	//=> 1
 | |
| 
 | |
| 	// Not cached anymore as the arguments changed
 | |
| 	memoized('bar');
 | |
| 	//=> 2
 | |
| 
 | |
| 	memoized('bar');
 | |
| 	//=> 2
 | |
| 	```
 | |
| 	*/
 | |
| 	<
 | |
| 		ArgumentsType extends unknown[],
 | |
| 		ReturnType extends unknown,
 | |
| 		CacheKeyType extends unknown
 | |
| 	>(
 | |
| 		fn: (...arguments: ArgumentsType) => ReturnType,
 | |
| 		options?: mem.Options<ArgumentsType, CacheKeyType, ReturnType>
 | |
| 	): (...arguments: ArgumentsType) => ReturnType;
 | |
| 
 | |
| 	/**
 | |
| 	Clear all cached data of a memoized function.
 | |
| 
 | |
| 	@param fn - Memoized function.
 | |
| 	*/
 | |
| 	clear<ArgumentsType extends unknown[], ReturnType extends unknown>(
 | |
| 		fn: (...arguments: ArgumentsType) => ReturnType
 | |
| 	): void;
 | |
| 
 | |
| 	// TODO: Remove this for the next major release
 | |
| 	default: typeof mem;
 | |
| };
 | |
| 
 | |
| export = mem;
 |