'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 };