"use strict";

/**
 * Демпфер
 *
 * @param {function} func Функция
 * @param {number} timeout Таймер (ms)
 * @param {number} force Номер аргумента хранящего статус принудительного выполнения
 *
 * @return {void}
 */
function damper(func, timeout = 300, force) {
  // Инициализация таймера
  let timer;

  return (...args) => {
    // Деинициализация таймера
    clearTimeout(timer);

    if (typeof force === 'number' && args[force]) {
      // Принудительное выполнение (игнорировать таймер)

      return func.apply(this, args);
    } else {
      // Обычное выполнение

      // Вызов функции (вход в рекурсию)
      timer = setTimeout(() => {
        return func.apply(this, args);
      }, timeout);
    }
  };
}

// Вызов события "Инициализирован демпфер"
document.dispatchEvent(
  new CustomEvent("damper.initialized", {
    detail: { damper },
  }),
);
