Provide no-args handling out of a box

This commit is contained in:
Mariusz Nowak
2014-05-01 11:35:48 +02:00
parent afc64e0543
commit f471af7835
4 changed files with 40 additions and 52 deletions

View File

@@ -20,7 +20,7 @@ resolveArgs = function (args) {
};
module.exports = function (original, length, options) {
var cache = create(null), conf, memLength, get, set, del, clear
var cache = create(null), conf, memLength, get, set, del, clear, extDel
, getListeners, setListeners, deleteListeners, memoized, resolve, resolvers;
if (length !== false) memLength = length;
else if (isNaN(original.length)) memLength = 1;
@@ -73,6 +73,22 @@ module.exports = function (original, length, options) {
if (setListeners) conf.emit('set', id);
return result;
}, memLength);
} else if (length === 0) {
memoized = function () {
var result;
if (hasOwnProperty.call(cache, 'data')) {
if (getListeners) conf.emit('get', 'data', arguments, this);
return cache.data;
}
if (!arguments.length) result = call.call(original, this);
else result = apply.call(original, this, arguments);
if (hasOwnProperty.call(cache, 'data')) {
throw customError("Circular invocation", 'CIRCULAR_INVOCATION');
}
cache.data = result;
if (setListeners) conf.emit('set', 'data');
return result;
};
} else {
memoized = function (arg) {
var result, args = arguments;
@@ -126,18 +142,25 @@ module.exports = function (original, length, options) {
emit: emit,
updateEnv: function () { original = conf.original; }
};
defineProperties(memoized, {
__memoized__: d(true),
delete: d(get ? defineLength(function (arg) {
if (get) {
extDel = defineLength(function (arg) {
var id, args = arguments;
if (resolve) args = resolve(args);
id = get(args);
if (id === null) return;
conf.delete(id);
}, memLength) : function (arg) {
}, memLength);
} else if (length === 0) {
extDel = function () { return conf.delete('data'); };
} else {
extDel = function (arg) {
if (resolve) arg = resolve(arguments)[0];
return conf.delete(arg);
}),
};
}
defineProperties(memoized, {
__memoized__: d(true),
delete: d(extDel),
clear: d(conf.clear)
});
return conf;