import type { TimeoutId } from '../timer' import { setTimeout, clearTimeout } from '../timer' // use lodash API export function throttle void>( fn: T, wait: number, options?: { leading?: boolean; trailing?: boolean } ) { const needLeadingExecution = options && options.leading !== undefined ? options.leading : true const needTrailingExecution = options && options.trailing !== undefined ? options.trailing : true let inWaitPeriod = false let pendingExecutionWithParameters: Parameters | undefined let pendingTimeoutId: TimeoutId return { throttled: (...parameters: Parameters) => { if (inWaitPeriod) { pendingExecutionWithParameters = parameters return } if (needLeadingExecution) { fn(...parameters) } else { pendingExecutionWithParameters = parameters } inWaitPeriod = true pendingTimeoutId = setTimeout(() => { if (needTrailingExecution && pendingExecutionWithParameters) { fn(...pendingExecutionWithParameters) } inWaitPeriod = false pendingExecutionWithParameters = undefined }, wait) }, cancel: () => { clearTimeout(pendingTimeoutId) inWaitPeriod = false pendingExecutionWithParameters = undefined }, } } // eslint-disable-next-line @typescript-eslint/no-empty-function export function noop() {}