12345678910111213141516171819202122232425262728293031323334353637 |
- "use strict";
- var callable = require("es5-ext/object/valid-callable")
- , forEach = require("es5-ext/object/for-each")
- , extensions = require("./lib/registered-extensions")
- , configure = require("./lib/configure-map")
- , resolveLength = require("./lib/resolve-length");
- module.exports = function self(fn /*, options */) {
- var options, length, conf;
- callable(fn);
- options = Object(arguments[1]);
- if (options.async && options.promise) {
- throw new Error("Options 'async' and 'promise' cannot be used together");
- }
- // Do not memoize already memoized function
- if (hasOwnProperty.call(fn, "__memoized__") && !options.force) return fn;
- // Resolve length;
- length = resolveLength(options.length, fn.length, options.async && extensions.async);
- // Configure cache map
- conf = configure(fn, length, options);
- // Bind eventual extensions
- forEach(extensions, function (extFn, name) {
- if (options[name]) extFn(options[name], conf, options);
- });
- if (self.__profiler__) self.__profiler__(conf);
- conf.updateEnv();
- return conf.memoized;
- };
|