1 | import areInputsEqual from './are-inputs-equal';
|
2 |
|
3 |
|
4 | export type EqualityFn = (newArgs: any[], lastArgs: any[]) => boolean;
|
5 |
|
6 | function memoizeOne<
|
7 | // Need to use 'any' rather than 'unknown' here as it has
|
8 | // The correct Generic narrowing behaviour.
|
9 | ResultFn extends (this: any, ...newArgs: any[]) => ReturnType<ResultFn>
|
10 | >(resultFn: ResultFn, isEqual: EqualityFn = areInputsEqual): ResultFn {
|
11 | let lastThis: unknown;
|
12 | let lastArgs: unknown[] = [];
|
13 | let lastResult: ReturnType<ResultFn>;
|
14 | let calledOnce: boolean = false;
|
15 |
|
16 |
|
17 | function memoized(this: unknown, ...newArgs: unknown[]): ReturnType<ResultFn> {
|
18 | if (calledOnce && lastThis === this && isEqual(newArgs, lastArgs)) {
|
19 | return lastResult;
|
20 | }
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | lastResult = resultFn.apply(this, newArgs);
|
26 | calledOnce = true;
|
27 | lastThis = this;
|
28 | lastArgs = newArgs;
|
29 | return lastResult;
|
30 | }
|
31 |
|
32 | return memoized as ResultFn;
|
33 | }
|
34 |
|
35 |
|
36 | export default memoizeOne;
|
37 |
|
38 | export { memoizeOne };
|