Files

55 lines
1.4 KiB
JavaScript

var counter = 0;
var buckets = {};
var setHarmonicInterval = function (fn, ms) {
var _a;
var id = counter++;
if (buckets[ms]) {
buckets[ms].listeners[id] = fn;
}
else {
var timer = setInterval(function () {
var listeners = buckets[ms].listeners;
var didThrow = false;
var lastError;
for (var _i = 0, _a = Object.values(listeners); _i < _a.length; _i++) {
var listener = _a[_i];
try {
listener();
}
catch (error) {
didThrow = true;
lastError = error;
}
}
if (didThrow)
throw lastError;
}, ms);
buckets[ms] = {
ms: ms,
timer: timer,
listeners: (_a = {},
_a[id] = fn,
_a),
};
}
return {
bucket: buckets[ms],
id: id,
};
};
var clearHarmonicInterval = function (_a) {
var bucket = _a.bucket, id = _a.id;
delete bucket.listeners[id];
var hasListeners = false;
for (var listener in bucket.listeners) {
hasListeners = true;
break;
}
if (!hasListeners) {
clearInterval(bucket.timer);
delete buckets[bucket.ms];
}
};
export { clearHarmonicInterval, setHarmonicInterval };