Home Reference Source

ts_temp/function/memoize/one.js

import equal from '../../is/equal';
/**
 * Memoize function with multiply arguments of any type.
 * Use it when you need to cache lookup only for last result (like reselect).
 *
 * @param {Function} fn
 * @param {Function} isEqual - checks equality for two values
 * @returns {Function}
 * @example
 *     const addFlag = obj => ({...obj, flag: true });
 *     const memoize = memoizeOnce(addFlag));
 *     memoize(1); // from addFlag call
 *     memoize(1); // from cache
 *     memoize(1,2) // from addFlag call,
 *     memoize(1) // from addFlag call, cache was flashed on previous step
 */
export default (fn, isEqual = equal) => {
    let lastArgs = [];
    let lastResult;
    let alreadyCalled = false;
    const isNewArgEqualToLast = (newArg, index) => isEqual(newArg, lastArgs[index]);
    return ((...newArgs) => {
        if (alreadyCalled && newArgs.length === lastArgs.length && newArgs.every(isNewArgEqualToLast)) {
            return lastResult;
        }
        lastResult = fn(...newArgs);
        alreadyCalled = true;
        lastArgs = newArgs;
        return lastResult;
    });
};