d3-timer.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // https://d3js.org/d3-timer/ v3.0.1 Copyright 2010-2021 Mike Bostock
  2. (function (global, factory) {
  3. typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  4. typeof define === 'function' && define.amd ? define(['exports'], factory) :
  5. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3 = global.d3 || {}));
  6. }(this, (function (exports) { 'use strict';
  7. var frame = 0, // is an animation frame pending?
  8. timeout$1 = 0, // is a timeout pending?
  9. interval$1 = 0, // are any timers active?
  10. pokeDelay = 1000, // how frequently we check for clock skew
  11. taskHead,
  12. taskTail,
  13. clockLast = 0,
  14. clockNow = 0,
  15. clockSkew = 0,
  16. clock = typeof performance === "object" && performance.now ? performance : Date,
  17. setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
  18. function now() {
  19. return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
  20. }
  21. function clearNow() {
  22. clockNow = 0;
  23. }
  24. function Timer() {
  25. this._call =
  26. this._time =
  27. this._next = null;
  28. }
  29. Timer.prototype = timer.prototype = {
  30. constructor: Timer,
  31. restart: function(callback, delay, time) {
  32. if (typeof callback !== "function") throw new TypeError("callback is not a function");
  33. time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
  34. if (!this._next && taskTail !== this) {
  35. if (taskTail) taskTail._next = this;
  36. else taskHead = this;
  37. taskTail = this;
  38. }
  39. this._call = callback;
  40. this._time = time;
  41. sleep();
  42. },
  43. stop: function() {
  44. if (this._call) {
  45. this._call = null;
  46. this._time = Infinity;
  47. sleep();
  48. }
  49. }
  50. };
  51. function timer(callback, delay, time) {
  52. var t = new Timer;
  53. t.restart(callback, delay, time);
  54. return t;
  55. }
  56. function timerFlush() {
  57. now(); // Get the current time, if not already set.
  58. ++frame; // Pretend we’ve set an alarm, if we haven’t already.
  59. var t = taskHead, e;
  60. while (t) {
  61. if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);
  62. t = t._next;
  63. }
  64. --frame;
  65. }
  66. function wake() {
  67. clockNow = (clockLast = clock.now()) + clockSkew;
  68. frame = timeout$1 = 0;
  69. try {
  70. timerFlush();
  71. } finally {
  72. frame = 0;
  73. nap();
  74. clockNow = 0;
  75. }
  76. }
  77. function poke() {
  78. var now = clock.now(), delay = now - clockLast;
  79. if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
  80. }
  81. function nap() {
  82. var t0, t1 = taskHead, t2, time = Infinity;
  83. while (t1) {
  84. if (t1._call) {
  85. if (time > t1._time) time = t1._time;
  86. t0 = t1, t1 = t1._next;
  87. } else {
  88. t2 = t1._next, t1._next = null;
  89. t1 = t0 ? t0._next = t2 : taskHead = t2;
  90. }
  91. }
  92. taskTail = t0;
  93. sleep(time);
  94. }
  95. function sleep(time) {
  96. if (frame) return; // Soonest alarm already set, or will be.
  97. if (timeout$1) timeout$1 = clearTimeout(timeout$1);
  98. var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
  99. if (delay > 24) {
  100. if (time < Infinity) timeout$1 = setTimeout(wake, time - clock.now() - clockSkew);
  101. if (interval$1) interval$1 = clearInterval(interval$1);
  102. } else {
  103. if (!interval$1) clockLast = clock.now(), interval$1 = setInterval(poke, pokeDelay);
  104. frame = 1, setFrame(wake);
  105. }
  106. }
  107. function timeout(callback, delay, time) {
  108. var t = new Timer;
  109. delay = delay == null ? 0 : +delay;
  110. t.restart(elapsed => {
  111. t.stop();
  112. callback(elapsed + delay);
  113. }, delay, time);
  114. return t;
  115. }
  116. function interval(callback, delay, time) {
  117. var t = new Timer, total = delay;
  118. if (delay == null) return t.restart(callback, delay, time), t;
  119. t._restart = t.restart;
  120. t.restart = function(callback, delay, time) {
  121. delay = +delay, time = time == null ? now() : +time;
  122. t._restart(function tick(elapsed) {
  123. elapsed += total;
  124. t._restart(tick, total += delay, time);
  125. callback(elapsed);
  126. }, delay, time);
  127. };
  128. t.restart(callback, delay, time);
  129. return t;
  130. }
  131. exports.interval = interval;
  132. exports.now = now;
  133. exports.timeout = timeout;
  134. exports.timer = timer;
  135. exports.timerFlush = timerFlush;
  136. Object.defineProperty(exports, '__esModule', { value: true });
  137. })));