123456789101112131415161718192021222324252627282930313233343536373839404142 |
- // @flow strict
- /**
- * Memoizes the provided three-argument function.
- */
- export default function memoize3<
- A1: { ... } | $ReadOnlyArray<mixed>,
- A2: { ... } | $ReadOnlyArray<mixed>,
- A3: { ... } | $ReadOnlyArray<mixed>,
- R: mixed,
- >(fn: (A1, A2, A3) => R): (A1, A2, A3) => R {
- let cache0;
- function memoized(a1, a2, a3) {
- if (!cache0) {
- cache0 = new WeakMap();
- }
- let cache1 = cache0.get(a1);
- let cache2;
- if (cache1) {
- cache2 = cache1.get(a2);
- if (cache2) {
- const cachedValue = cache2.get(a3);
- if (cachedValue !== undefined) {
- return cachedValue;
- }
- }
- } else {
- cache1 = new WeakMap();
- cache0.set(a1, cache1);
- }
- if (!cache2) {
- cache2 = new WeakMap();
- cache1.set(a2, cache2);
- }
- const newValue = fn(a1, a2, a3);
- cache2.set(a3, newValue);
- return newValue;
- }
- return memoized;
- }
|