1 | declare type AnyFunction = (...arguments_: any) => any;
|
---|
2 | interface CacheStorageContent<ValueType> {
|
---|
3 | data: ValueType;
|
---|
4 | maxAge: number;
|
---|
5 | }
|
---|
6 | interface CacheStorage<KeyType, ValueType> {
|
---|
7 | has: (key: KeyType) => boolean;
|
---|
8 | get: (key: KeyType) => CacheStorageContent<ValueType> | undefined;
|
---|
9 | set: (key: KeyType, value: CacheStorageContent<ValueType>) => void;
|
---|
10 | delete: (key: KeyType) => void;
|
---|
11 | clear?: () => void;
|
---|
12 | }
|
---|
13 | interface Options<FunctionToMemoize extends AnyFunction, CacheKeyType> {
|
---|
14 | /**
|
---|
15 | Milliseconds until the cache expires.
|
---|
16 |
|
---|
17 | @default Infinity
|
---|
18 | */
|
---|
19 | readonly maxAge?: number;
|
---|
20 | /**
|
---|
21 | Determines the cache key for storing the result based on the function arguments. By default, __only the first argument is considered__ and it only works with [primitives](https://developer.mozilla.org/en-US/docs/Glossary/Primitive).
|
---|
22 |
|
---|
23 | A `cacheKey` function can return any type supported by `Map` (or whatever structure you use in the `cache` option).
|
---|
24 |
|
---|
25 | You can have it cache **all** the arguments by value with `JSON.stringify`, if they are compatible:
|
---|
26 |
|
---|
27 | ```
|
---|
28 | import mem = require('mem');
|
---|
29 |
|
---|
30 | mem(function_, {cacheKey: JSON.stringify});
|
---|
31 | ```
|
---|
32 |
|
---|
33 | Or you can use a more full-featured serializer like [serialize-javascript](https://github.com/yahoo/serialize-javascript) to add support for `RegExp`, `Date` and so on.
|
---|
34 |
|
---|
35 | ```
|
---|
36 | import mem = require('mem');
|
---|
37 | import serializeJavascript = require('serialize-javascript');
|
---|
38 |
|
---|
39 | mem(function_, {cacheKey: serializeJavascript});
|
---|
40 | ```
|
---|
41 |
|
---|
42 | @default arguments_ => arguments_[0]
|
---|
43 | @example arguments_ => JSON.stringify(arguments_)
|
---|
44 | */
|
---|
45 | readonly cacheKey?: (arguments_: Parameters<FunctionToMemoize>) => CacheKeyType;
|
---|
46 | /**
|
---|
47 | Use a different cache storage. Must implement the following methods: `.has(key)`, `.get(key)`, `.set(key, value)`, `.delete(key)`, and optionally `.clear()`. You could for example use a `WeakMap` instead or [`quick-lru`](https://github.com/sindresorhus/quick-lru) for a LRU cache.
|
---|
48 |
|
---|
49 | @default new Map()
|
---|
50 | @example new WeakMap()
|
---|
51 | */
|
---|
52 | readonly cache?: CacheStorage<CacheKeyType, ReturnType<FunctionToMemoize>>;
|
---|
53 | }
|
---|
54 | /**
|
---|
55 | [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.
|
---|
56 |
|
---|
57 | @param fn - Function to be memoized.
|
---|
58 |
|
---|
59 | @example
|
---|
60 | ```
|
---|
61 | import mem = require('mem');
|
---|
62 |
|
---|
63 | let i = 0;
|
---|
64 | const counter = () => ++i;
|
---|
65 | const memoized = mem(counter);
|
---|
66 |
|
---|
67 | memoized('foo');
|
---|
68 | //=> 1
|
---|
69 |
|
---|
70 | // Cached as it's the same arguments
|
---|
71 | memoized('foo');
|
---|
72 | //=> 1
|
---|
73 |
|
---|
74 | // Not cached anymore as the arguments changed
|
---|
75 | memoized('bar');
|
---|
76 | //=> 2
|
---|
77 |
|
---|
78 | memoized('bar');
|
---|
79 | //=> 2
|
---|
80 | ```
|
---|
81 | */
|
---|
82 | declare const mem: {
|
---|
83 | <FunctionToMemoize extends AnyFunction, CacheKeyType>(fn: FunctionToMemoize, { cacheKey, cache, maxAge }?: Options<FunctionToMemoize, CacheKeyType>): FunctionToMemoize;
|
---|
84 | /**
|
---|
85 | @returns A [decorator](https://github.com/tc39/proposal-decorators) to memoize class methods or static class methods.
|
---|
86 |
|
---|
87 | @example
|
---|
88 | ```
|
---|
89 | import mem = require('mem');
|
---|
90 |
|
---|
91 | class Example {
|
---|
92 | index = 0
|
---|
93 |
|
---|
94 | @mem.decorator()
|
---|
95 | counter() {
|
---|
96 | return ++this.index;
|
---|
97 | }
|
---|
98 | }
|
---|
99 |
|
---|
100 | class ExampleWithOptions {
|
---|
101 | index = 0
|
---|
102 |
|
---|
103 | @mem.decorator({maxAge: 1000})
|
---|
104 | counter() {
|
---|
105 | return ++this.index;
|
---|
106 | }
|
---|
107 | }
|
---|
108 | ```
|
---|
109 | */
|
---|
110 | decorator<FunctionToMemoize_1 extends AnyFunction, CacheKeyType_1>(options?: Options<FunctionToMemoize_1, CacheKeyType_1>): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void;
|
---|
111 | /**
|
---|
112 | Clear all cached data of a memoized function.
|
---|
113 |
|
---|
114 | @param fn - Memoized function.
|
---|
115 | */
|
---|
116 | clear(fn: AnyFunction): void;
|
---|
117 | };
|
---|
118 | export = mem;
|
---|