UNPKG

748 BTypeScriptView Raw
1export default function memoize<Result, Deps extends readonly any[]>(
2 callback: (...deps: Deps) => Result
3) {
4 let previous: Deps | undefined;
5 let result: Result | undefined;
6
7 return (...dependencies: Deps): Result => {
8 let hasChanged = false;
9
10 if (previous) {
11 if (previous.length !== dependencies.length) {
12 hasChanged = true;
13 } else {
14 for (let i = 0; i < previous.length; i++) {
15 if (previous[i] !== dependencies[i]) {
16 hasChanged = true;
17 break;
18 }
19 }
20 }
21 } else {
22 hasChanged = true;
23 }
24
25 previous = dependencies;
26
27 if (hasChanged || result === undefined) {
28 result = callback(...dependencies);
29 }
30
31 return result;
32 };
33}