set-harmonic-interval
Version:
Works similar to `setInterval`, but calls all callbacks scheduled using `setHarmonicInterval` all at once, which have same delay in milliseconds.
55 lines (53 loc) • 1.46 kB
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 };