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.
48 lines
1.1 KiB
48 lines
1.1 KiB
// 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]; |
|
}) |
|
}); |
|
};
|
|
|