import type {d3Transition} from "../../types/types";import {window} from "./browser";import {isArray, isNumber, isTabVisible, runUntil} from "./util";
const {setTimeout, clearTimeout} = window;
export function generateResize(option: boolean|number) { const fn: any[] = []; let timeout;
const callResizeFn = function() { callResizeFn.clear();
if (option === false && window.requestIdleCallback) { requestIdleCallback(() => { fn.forEach((f: Function) => f()); }, {timeout: 200}); } else { timeout = setTimeout(() => { fn.forEach((f: Function) => f()); }, isNumber(option) ? option : 200); } };
callResizeFn.clear = () => { if (timeout) { clearTimeout(timeout); timeout = null; } };
callResizeFn.add = f => fn.push(f); callResizeFn.remove = f => fn.splice(fn.indexOf(f), 1);
return callResizeFn;}
type Transition = boolean | d3Transition;
export function generateWait() { let transitionsToWait: Transition[] = [];
const f = function(selection: d3Transition, callback: Function) { function loop(): boolean { let done = 0;
for (let i = 0, t; (t = transitionsToWait[i]); i++) { if (t === true || t.empty?.()) { done++; continue; }
if (isTabVisible() === false) { done = transitionsToWait.length; break; }
try { t.transition(); } catch (e) { done++; } }
return done === transitionsToWait.length; }
runUntil(() => { callback?.(); }, loop); };
f.add = function(t: Transition | Transition[]) { isArray(t) ? (transitionsToWait = transitionsToWait.concat(t)) : transitionsToWait.push(t); };
return f;}