export default function debounce(func, wait, immediate) { let timeout; function _debounce(...args) { const context = this; const later = function __debounce() { timeout = null; if (!immediate) { func.apply(context, args); } }; const callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) { func.apply(context, args); } } _debounce.stop = () => clearTimeout(timeout); return _debounce; }