/**
 * 函数防抖：将几次操作合并为一次操作进行。原理是维护一个计时器，规定在delay时间后触发函数，
 * 但是在delay时间内再次触发的话，就会取消之前的计时器而重新设置。这样一来，只有最后一次操作能被触发。
 * @param {*} func 被防抖函数
 * @param {*} delay 默认1500ms。等待的时间(ms)
 * @param {*} immediate 默认为true。true表示立即执行然后再等待，false表示进入等待，达到条件再触发
 * @returns {func} func's result
 * @function debounce
 * @static
 * @example
 * --------------------------------------------------------------------------
 * import {debounce} from '@riil-frontend/utils';
 * debounce(func, 1000，true);
 * debounce(func, 1000);
 */
export var debounce = function debounce(func) {
  var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1500;
  var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  var timeout;
  return function () {
    var args = arguments;
    var context = this; //每次清除已有的计时器重新计时

    if (timeout) clearTimeout(timeout); //执行后再等待

    if (immediate) {
      //判断是否满足立即执行的条件，
      var callNow = !timeout;
      timeout = setTimeout(function () {
        timeout = null;
      }, delay); //立即执行

      if (callNow) return func.apply(context, args);
    } else {
      timeout = setTimeout(function () {
        return func.apply(context, args);
      }, delay);
    }
  };
};