Nav apraksta

priority-queue.js 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. this["wp"] = this["wp"] || {}; this["wp"]["priorityQueue"] =
  2. /******/ (function(modules) { // webpackBootstrap
  3. /******/ // The module cache
  4. /******/ var installedModules = {};
  5. /******/
  6. /******/ // The require function
  7. /******/ function __webpack_require__(moduleId) {
  8. /******/
  9. /******/ // Check if module is in cache
  10. /******/ if(installedModules[moduleId]) {
  11. /******/ return installedModules[moduleId].exports;
  12. /******/ }
  13. /******/ // Create a new module (and put it into the cache)
  14. /******/ var module = installedModules[moduleId] = {
  15. /******/ i: moduleId,
  16. /******/ l: false,
  17. /******/ exports: {}
  18. /******/ };
  19. /******/
  20. /******/ // Execute the module function
  21. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  22. /******/
  23. /******/ // Flag the module as loaded
  24. /******/ module.l = true;
  25. /******/
  26. /******/ // Return the exports of the module
  27. /******/ return module.exports;
  28. /******/ }
  29. /******/
  30. /******/
  31. /******/ // expose the modules object (__webpack_modules__)
  32. /******/ __webpack_require__.m = modules;
  33. /******/
  34. /******/ // expose the module cache
  35. /******/ __webpack_require__.c = installedModules;
  36. /******/
  37. /******/ // define getter function for harmony exports
  38. /******/ __webpack_require__.d = function(exports, name, getter) {
  39. /******/ if(!__webpack_require__.o(exports, name)) {
  40. /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
  41. /******/ }
  42. /******/ };
  43. /******/
  44. /******/ // define __esModule on exports
  45. /******/ __webpack_require__.r = function(exports) {
  46. /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
  47. /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
  48. /******/ }
  49. /******/ Object.defineProperty(exports, '__esModule', { value: true });
  50. /******/ };
  51. /******/
  52. /******/ // create a fake namespace object
  53. /******/ // mode & 1: value is a module id, require it
  54. /******/ // mode & 2: merge all properties of value into the ns
  55. /******/ // mode & 4: return value when already ns object
  56. /******/ // mode & 8|1: behave like require
  57. /******/ __webpack_require__.t = function(value, mode) {
  58. /******/ if(mode & 1) value = __webpack_require__(value);
  59. /******/ if(mode & 8) return value;
  60. /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
  61. /******/ var ns = Object.create(null);
  62. /******/ __webpack_require__.r(ns);
  63. /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
  64. /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
  65. /******/ return ns;
  66. /******/ };
  67. /******/
  68. /******/ // getDefaultExport function for compatibility with non-harmony modules
  69. /******/ __webpack_require__.n = function(module) {
  70. /******/ var getter = module && module.__esModule ?
  71. /******/ function getDefault() { return module['default']; } :
  72. /******/ function getModuleExports() { return module; };
  73. /******/ __webpack_require__.d(getter, 'a', getter);
  74. /******/ return getter;
  75. /******/ };
  76. /******/
  77. /******/ // Object.prototype.hasOwnProperty.call
  78. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  79. /******/
  80. /******/ // __webpack_public_path__
  81. /******/ __webpack_require__.p = "";
  82. /******/
  83. /******/
  84. /******/ // Load entry module and return exports
  85. /******/ return __webpack_require__(__webpack_require__.s = "XPKI");
  86. /******/ })
  87. /************************************************************************/
  88. /******/ ({
  89. /***/ "XPKI":
  90. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  91. "use strict";
  92. // ESM COMPAT FLAG
  93. __webpack_require__.r(__webpack_exports__);
  94. // EXPORTS
  95. __webpack_require__.d(__webpack_exports__, "createQueue", function() { return /* binding */ createQueue; });
  96. // CONCATENATED MODULE: ./node_modules/@wordpress/priority-queue/build-module/request-idle-callback.js
  97. /**
  98. * @typedef {( timeOrDeadline: IdleDeadline | number ) => void} Callback
  99. */
  100. /**
  101. * @return {(callback: Callback) => void} RequestIdleCallback
  102. */
  103. function createRequestIdleCallback() {
  104. if (typeof window === 'undefined') {
  105. return callback => {
  106. setTimeout(() => callback(Date.now()), 0);
  107. };
  108. }
  109. return window.requestIdleCallback || window.requestAnimationFrame;
  110. }
  111. /* harmony default export */ var request_idle_callback = (createRequestIdleCallback());
  112. // CONCATENATED MODULE: ./node_modules/@wordpress/priority-queue/build-module/index.js
  113. /**
  114. * Internal dependencies
  115. */
  116. /**
  117. * Enqueued callback to invoke once idle time permits.
  118. *
  119. * @typedef {()=>void} WPPriorityQueueCallback
  120. */
  121. /**
  122. * An object used to associate callbacks in a particular context grouping.
  123. *
  124. * @typedef {{}} WPPriorityQueueContext
  125. */
  126. /**
  127. * Function to add callback to priority queue.
  128. *
  129. * @typedef {(element:WPPriorityQueueContext,item:WPPriorityQueueCallback)=>void} WPPriorityQueueAdd
  130. */
  131. /**
  132. * Function to flush callbacks from priority queue.
  133. *
  134. * @typedef {(element:WPPriorityQueueContext)=>boolean} WPPriorityQueueFlush
  135. */
  136. /**
  137. * Reset the queue.
  138. *
  139. * @typedef {()=>void} WPPriorityQueueReset
  140. */
  141. /**
  142. * Priority queue instance.
  143. *
  144. * @typedef {Object} WPPriorityQueue
  145. *
  146. * @property {WPPriorityQueueAdd} add Add callback to queue for context.
  147. * @property {WPPriorityQueueFlush} flush Flush queue for context.
  148. * @property {WPPriorityQueueReset} reset Reset queue.
  149. */
  150. /**
  151. * Creates a context-aware queue that only executes
  152. * the last task of a given context.
  153. *
  154. * @example
  155. *```js
  156. * import { createQueue } from '@wordpress/priority-queue';
  157. *
  158. * const queue = createQueue();
  159. *
  160. * // Context objects.
  161. * const ctx1 = {};
  162. * const ctx2 = {};
  163. *
  164. * // For a given context in the queue, only the last callback is executed.
  165. * queue.add( ctx1, () => console.log( 'This will be printed first' ) );
  166. * queue.add( ctx2, () => console.log( 'This won\'t be printed' ) );
  167. * queue.add( ctx2, () => console.log( 'This will be printed second' ) );
  168. *```
  169. *
  170. * @return {WPPriorityQueue} Queue object with `add`, `flush` and `reset` methods.
  171. */
  172. const createQueue = () => {
  173. /** @type {WPPriorityQueueContext[]} */
  174. let waitingList = [];
  175. /** @type {WeakMap<WPPriorityQueueContext,WPPriorityQueueCallback>} */
  176. let elementsMap = new WeakMap();
  177. let isRunning = false;
  178. /**
  179. * Callback to process as much queue as time permits.
  180. *
  181. * @param {IdleDeadline|number} deadline Idle callback deadline object, or
  182. * animation frame timestamp.
  183. */
  184. const runWaitingList = deadline => {
  185. const hasTimeRemaining = typeof deadline === 'number' ? () => false : () => deadline.timeRemaining() > 0;
  186. do {
  187. if (waitingList.length === 0) {
  188. isRunning = false;
  189. return;
  190. }
  191. const nextElement =
  192. /** @type {WPPriorityQueueContext} */
  193. waitingList.shift();
  194. const callback =
  195. /** @type {WPPriorityQueueCallback} */
  196. elementsMap.get(nextElement); // If errors with undefined callbacks are encountered double check that all of your useSelect calls
  197. // have all dependecies set correctly in second parameter. Missing dependencies can cause unexpected
  198. // loops and race conditions in the queue.
  199. callback();
  200. elementsMap.delete(nextElement);
  201. } while (hasTimeRemaining());
  202. request_idle_callback(runWaitingList);
  203. };
  204. /**
  205. * Add a callback to the queue for a given context.
  206. *
  207. * @type {WPPriorityQueueAdd}
  208. *
  209. * @param {WPPriorityQueueContext} element Context object.
  210. * @param {WPPriorityQueueCallback} item Callback function.
  211. */
  212. const add = (element, item) => {
  213. if (!elementsMap.has(element)) {
  214. waitingList.push(element);
  215. }
  216. elementsMap.set(element, item);
  217. if (!isRunning) {
  218. isRunning = true;
  219. request_idle_callback(runWaitingList);
  220. }
  221. };
  222. /**
  223. * Flushes queue for a given context, returning true if the flush was
  224. * performed, or false if there is no queue for the given context.
  225. *
  226. * @type {WPPriorityQueueFlush}
  227. *
  228. * @param {WPPriorityQueueContext} element Context object.
  229. *
  230. * @return {boolean} Whether flush was performed.
  231. */
  232. const flush = element => {
  233. if (!elementsMap.has(element)) {
  234. return false;
  235. }
  236. const index = waitingList.indexOf(element);
  237. waitingList.splice(index, 1);
  238. const callback =
  239. /** @type {WPPriorityQueueCallback} */
  240. elementsMap.get(element);
  241. elementsMap.delete(element);
  242. callback();
  243. return true;
  244. };
  245. /**
  246. * Reset the queue without running the pending callbacks.
  247. *
  248. * @type {WPPriorityQueueReset}
  249. */
  250. const reset = () => {
  251. waitingList = [];
  252. elementsMap = new WeakMap();
  253. isRunning = false;
  254. };
  255. return {
  256. add,
  257. flush,
  258. reset
  259. };
  260. };
  261. /***/ })
  262. /******/ });