export function listen(...listenerSpecs) { return new Promise((resolve) => { let removeAllEventListeners; let listeners = listenerSpecs.map(([element, eventName]) => { let listener = (event) => { removeAllEventListeners(); resolve(event); }; element.addEventListener(eventName, listener); return { element, eventName, func: listener }; }); removeAllEventListeners = () => { for (let listener of listeners) { listener.element.removeEventListener(listener.eventName, listener.func); } }; }); } export function debounce(time, fn) { let timeout = null; return (...args) => { if (timeout == null) { fn(...args); timeout = setTimeout(() => (timeout = null), time); } }; }