function debounce (func, wait, immediate) {
  let timeout
  return function () {
    const context = this; const args = arguments
    const later = () => {
      timeout = null
      if (!immediate) func.apply(context, args)
    }
    const callNow = immediate && !timeout
    clearTimeout(timeout)
    timeout = setTimeout(later, wait)
    if (callNow) func.apply(context, args)
  }
}
Returns a function, that, as long as it continues to be invoked, will not
be triggered. The function will be called after it stops being called for
N milliseconds.

Source: https://davidwalsh.name/javascript-debounce-function

@param {function} func
@param {number} wait                 Number in milliseconds
@param {boolean} [immediate=false]   If `immediate` is passed, trigger the
                                     function on the leading edge, instead
                                     of the trailing.
@return {function} Return the debounced function