UNPKG

@tamagui/react-native-web-lite

Version:
111 lines 3.33 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var TaskQueue_exports = {}; __export(TaskQueue_exports, { TaskQueue: () => TaskQueue }); module.exports = __toCommonJS(TaskQueue_exports); var import_react_native_web_internals = require("@tamagui/react-native-web-internals"); class TaskQueue { _queueStack; _onMoreTasks; constructor({ onMoreTasks }) { this._onMoreTasks = onMoreTasks; this._queueStack = [{ tasks: [], popable: true }]; } 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 { if (typeof task === "object" && "gen" in task) { this._genPromise(task); } else if (typeof task === "object" && "run" in task) { task.run(); } else { (0, import_react_native_web_internals.invariant)(typeof task === "function", "Expected Function, SimpleTask, or PromiseTask, but got:\n" + JSON.stringify(task, null, 2)); task(); } } catch (e) { if (e instanceof Error) { e.message = "TaskQueue: Error with task " + (task?.name || "") + ": " + e.message; } throw e; } } } _getCurrentQueue() { const stackIdx = this._queueStack.length - 1; const queue = this._queueStack[stackIdx]; if (queue.popable && queue.tasks.length === 0 && stackIdx > 0) { this._queueStack.pop(); return this._getCurrentQueue(); } else { return queue.tasks; } } _genPromise(task) { const length = this._queueStack.push({ tasks: [], popable: false }); const stackIdx = length - 1; const stackItem = this._queueStack[stackIdx]; task.gen().then(() => { stackItem.popable = true; if (this.hasTasksToProcess()) { this._onMoreTasks(); } }).catch(ex => { setTimeout(() => { if (ex instanceof Error) { ex.message = `TaskQueue: Error resolving Promise in task ${task.name}: ${ex.message}`; } throw ex; }, 0); }); } }