FP/memoize.js

const to_array = require('../Convertor/to_array');

/**
 * Creates a function that memoizes the result of function.
 *
 * @memberof module:FP
 * @param {Function} fn Function to memoize.
 * @returns {Function} Memoized function.
 * @since 0.1.0
 * @example
 * const fibonacci = memoize(function(n) {
 *     return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
 * });
 *
 * fibonacci(9); // => 34
 * fibonacci(9); // => From cache: 34
 */
function memoize(fn) {
    const cache = {};
    return function takeArguments() {
        const args = to_array(arguments);
        if (args in cache) {
            return cache[args];
        }

        return (cache[args] = fn.apply(this, args));
    };
}

module.exports = memoize;