Files
30-seconds-of-code/node_modules/requestanimationframe-timer/dist/index.js
2019-08-20 15:52:05 +02:00

121 lines
2.9 KiB
JavaScript

'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _raf = require('raf');
var _raf2 = _interopRequireDefault(_raf);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var MODE_TIMEOUT = 0;
var MODE_INTERVAL = 1;
var fnStacks = new Map();
var runArray = new Set();
var rafStarted = false;
var startId = 0;
function getTimeStamp() {
return new Date().getTime();
}
function executeFn(value) {
var fn = value.fn,
args = value.args;
fn.apply(undefined, _toConsumableArray(args));
}
function runFunction() {
if (runArray.size === 0) return;
runArray.forEach(executeFn);
runArray.clear();
}
var checkTick = function checkTick(currentTimeTick) {
return function (value, id) {
var nextTick = value.nextTick,
ms = value.ms,
mode = value.mode;
if (currentTimeTick - nextTick >= 0) {
runArray.add(value);
if (mode === MODE_TIMEOUT) {
fnStacks.delete(id);
} else {
fnStacks.set(id, Object.assign({}, value, {
nextTick: nextTick + ms
}));
}
}
};
};
function loop() {
var currentTimeTick = getTimeStamp();
fnStacks.forEach(checkTick(currentTimeTick));
runFunction();
if (fnStacks.size === 0) {
rafStarted = false;
return;
}
(0, _raf2.default)(loop);
}
function addId(_ref) {
var fn = _ref.fn,
_ref$ms = _ref.ms,
ms = _ref$ms === undefined ? 0 : _ref$ms,
args = _ref.args,
mode = _ref.mode;
if (!fn) return null;
var currentId = startId;
fnStacks.set(currentId, {
fn: fn,
ms: ms,
nextTick: getTimeStamp() + ms,
args: args,
mode: mode
});
if (!rafStarted) {
rafStarted = true;
(0, _raf2.default)(loop);
}
startId += 1;
return currentId;
}
function removeId(id) {
if (fnStacks.has(id)) {
fnStacks.delete(id);
}
if (fnStacks.size === 0) {
rafStarted = false;
}
}
exports.default = {
setTimeout: function setTimeout(fn) {
for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
args[_key - 2] = arguments[_key];
}
var ms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
return addId({ fn: fn, ms: ms, args: args, mode: MODE_TIMEOUT });
},
clearTimeout: removeId,
setInterval: function setInterval(fn) {
for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
args[_key2 - 2] = arguments[_key2];
}
var ms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
return addId({ fn: fn, ms: ms, args: args, mode: MODE_INTERVAL });
},
clearInterval: removeId
};