/**
 * 防抖函数
 * @param func 需要执行的函数
 * @param wait 等待时间（毫秒）
 * @param immediate 是否立即执行
 */
export function debounce<T extends (...args: any[]) => any>(
  func: T,
  wait: number,
  immediate = false,
): (...args: Parameters<T>) => void {
  let timeout: ReturnType<typeof setTimeout> | null = null

  return function (this: any, ...args: Parameters<T>) {
    // 直接使用 this，避免本地变量别名

    if (timeout)
      clearTimeout(timeout)

    if (immediate) {
      const callNow = !timeout
      timeout = setTimeout(() => {
        timeout = null
      }, wait)
      if (callNow)
        func.apply(this, args)
    }
    else {
      timeout = setTimeout(() => {
        func.apply(this, args)
      }, wait)
    }
  }
}

/**
 * 节流函数
 * @param func 需要执行的函数
 * @param wait 等待时间（毫秒）
 */
export function throttle<T extends (...args: any[]) => any>(
  func: T,
  wait: number,
): (...args: Parameters<T>) => void {
  let previous = 0

  return function (this: any, ...args: Parameters<T>) {
    const now = Date.now()

    if (now - previous > wait) {
      func.apply(this, args)
      previous = now
    }
  }
}
