You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.1 KiB
49 lines
1.1 KiB
6 years ago
|
// Reference counter, useful for garbage collector like functionality
|
||
|
|
||
|
"use strict";
|
||
|
|
||
|
var d = require("d")
|
||
|
, extensions = require("../lib/registered-extensions")
|
||
|
|
||
|
, create = Object.create, defineProperties = Object.defineProperties;
|
||
|
|
||
|
extensions.refCounter = function (ignore, conf, options) {
|
||
|
var cache, postfix;
|
||
|
|
||
|
cache = create(null);
|
||
|
postfix = (options.async && extensions.async) || (options.promise && extensions.promise)
|
||
|
? "async" : "";
|
||
|
|
||
|
conf.on("set" + postfix, function (id, length) {
|
||
|
cache[id] = length || 1;
|
||
|
});
|
||
|
conf.on("get" + postfix, function (id) {
|
||
|
++cache[id];
|
||
|
});
|
||
|
conf.on("delete" + postfix, function (id) {
|
||
|
delete cache[id];
|
||
|
});
|
||
|
conf.on("clear" + postfix, function () {
|
||
|
cache = {};
|
||
|
});
|
||
|
|
||
|
defineProperties(conf.memoized, {
|
||
|
deleteRef: d(function () {
|
||
|
var id = conf.get(arguments);
|
||
|
if (id === null) return null;
|
||
|
if (!cache[id]) return null;
|
||
|
if (!--cache[id]) {
|
||
|
conf.delete(id);
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}),
|
||
|
getRefCount: d(function () {
|
||
|
var id = conf.get(arguments);
|
||
|
if (id === null) return 0;
|
||
|
if (!cache[id]) return 0;
|
||
|
return cache[id];
|
||
|
})
|
||
|
});
|
||
|
};
|