function debounce(fn, delay) {
  let timer;
  return (...args) => {
    clearTimeout(timer);
    timer = setTimeout(() => fn(...args), delay);
  };
}

// usage
const handleSearch = debounce(() => {
  // fetch data
}, 300);