Spaces:
Sleeping
Sleeping
| import "../core/document"; | |
| import "../core/vendor"; | |
| var d3_timer_queueHead, | |
| d3_timer_queueTail, | |
| d3_timer_interval, // is an interval (or frame) active? | |
| d3_timer_timeout, // is a timeout active? | |
| d3_timer_frame = this[d3_vendorSymbol(this, "requestAnimationFrame")] || function(callback) { setTimeout(callback, 17); }; | |
| // The timer will continue to fire until callback returns true. | |
| d3.timer = function() { | |
| d3_timer.apply(this, arguments); | |
| }; | |
| function d3_timer(callback, delay, then) { | |
| var n = arguments.length; | |
| if (n < 2) delay = 0; | |
| if (n < 3) then = Date.now(); | |
| // Add the callback to the tail of the queue. | |
| var time = then + delay, timer = {c: callback, t: time, n: null}; | |
| if (d3_timer_queueTail) d3_timer_queueTail.n = timer; | |
| else d3_timer_queueHead = timer; | |
| d3_timer_queueTail = timer; | |
| // Start animatin'! | |
| if (!d3_timer_interval) { | |
| d3_timer_timeout = clearTimeout(d3_timer_timeout); | |
| d3_timer_interval = 1; | |
| d3_timer_frame(d3_timer_step); | |
| } | |
| return timer; | |
| } | |
| function d3_timer_step() { | |
| var now = d3_timer_mark(), | |
| delay = d3_timer_sweep() - now; | |
| if (delay > 24) { | |
| if (isFinite(delay)) { | |
| clearTimeout(d3_timer_timeout); | |
| d3_timer_timeout = setTimeout(d3_timer_step, delay); | |
| } | |
| d3_timer_interval = 0; | |
| } else { | |
| d3_timer_interval = 1; | |
| d3_timer_frame(d3_timer_step); | |
| } | |
| } | |
| d3.timer.flush = function() { | |
| d3_timer_mark(); | |
| d3_timer_sweep(); | |
| }; | |
| function d3_timer_mark() { | |
| var now = Date.now(), | |
| timer = d3_timer_queueHead; | |
| while (timer) { | |
| if (now >= timer.t && timer.c(now - timer.t)) timer.c = null; | |
| timer = timer.n; | |
| } | |
| return now; | |
| } | |
| // Flush after callbacks to avoid concurrent queue modification. | |
| // Returns the time of the earliest active timer, post-sweep. | |
| function d3_timer_sweep() { | |
| var t0, | |
| t1 = d3_timer_queueHead, | |
| time = Infinity; | |
| while (t1) { | |
| if (t1.c) { | |
| if (t1.t < time) time = t1.t; | |
| t1 = (t0 = t1).n; | |
| } else { | |
| t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n; | |
| } | |
| } | |
| d3_timer_queueTail = t0; | |
| return time; | |
| } | |