UNPKG

@tamagui/react-native-web-lite

Version:
66 lines (65 loc) 2.18 kB
import { invariant } from "@tamagui/react-native-web-internals"; class TaskQueue { _queueStack; _onMoreTasks; constructor({ onMoreTasks }) { this._onMoreTasks = onMoreTasks, this._queueStack = [{ tasks: [], popable: !0 }]; } enqueue(task) { this._getCurrentQueue().push(task); } enqueueTasks(tasks) { tasks.forEach(task => this.enqueue(task)); } cancelTasks(tasksToCancel) { this._queueStack = this._queueStack.map(queue => ({ ...queue, tasks: queue.tasks.filter(task => !tasksToCancel.includes(task)) })).filter((queue, idx) => queue.tasks.length > 0 || idx === 0); } hasTasksToProcess() { return this._getCurrentQueue().length > 0; } /** * Executes the next task in the queue. */ processNext() { const queue = this._getCurrentQueue(); if (queue.length) { const task = queue.shift(); try { typeof task == "object" && "gen" in task ? this._genPromise(task) : typeof task == "object" && "run" in task ? task.run() : (invariant(typeof task == "function", `Expected Function, SimpleTask, or PromiseTask, but got: ` + JSON.stringify(task, null, 2)), task()); } catch (e) { throw e instanceof Error && (e.message = "TaskQueue: Error with task " + (task?.name || "") + ": " + e.message), e; } } } _getCurrentQueue() { const stackIdx = this._queueStack.length - 1, queue = this._queueStack[stackIdx]; return queue.popable && queue.tasks.length === 0 && stackIdx > 0 ? (this._queueStack.pop(), this._getCurrentQueue()) : queue.tasks; } _genPromise(task) { const stackIdx = this._queueStack.push({ tasks: [], popable: !1 }) - 1, stackItem = this._queueStack[stackIdx]; task.gen().then(() => { stackItem.popable = !0, this.hasTasksToProcess() && this._onMoreTasks(); }).catch(ex => { setTimeout(() => { throw ex instanceof Error && (ex.message = `TaskQueue: Error resolving Promise in task ${task.name}: ${ex.message}`), ex; }, 0); }); } } var TaskQueue_default = TaskQueue; export { TaskQueue_default as default }; //# sourceMappingURL=TaskQueue.mjs.map