Files
cannaiq/frontend/node_modules/es-toolkit/dist/function/debounce.js
2025-11-28 19:45:44 -07:00

67 lines
1.7 KiB
JavaScript

'use strict';
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
function debounce(func, debounceMs, { signal, edges } = {}) {
let pendingThis = undefined;
let pendingArgs = null;
const leading = edges != null && edges.includes('leading');
const trailing = edges == null || edges.includes('trailing');
const invoke = () => {
if (pendingArgs !== null) {
func.apply(pendingThis, pendingArgs);
pendingThis = undefined;
pendingArgs = null;
}
};
const onTimerEnd = () => {
if (trailing) {
invoke();
}
cancel();
};
let timeoutId = null;
const schedule = () => {
if (timeoutId != null) {
clearTimeout(timeoutId);
}
timeoutId = setTimeout(() => {
timeoutId = null;
onTimerEnd();
}, debounceMs);
};
const cancelTimer = () => {
if (timeoutId !== null) {
clearTimeout(timeoutId);
timeoutId = null;
}
};
const cancel = () => {
cancelTimer();
pendingThis = undefined;
pendingArgs = null;
};
const flush = () => {
invoke();
};
const debounced = function (...args) {
if (signal?.aborted) {
return;
}
pendingThis = this;
pendingArgs = args;
const isFirstCall = timeoutId == null;
schedule();
if (leading && isFirstCall) {
invoke();
}
};
debounced.schedule = schedule;
debounced.cancel = cancel;
debounced.flush = flush;
signal?.addEventListener('abort', cancel, { once: true });
return debounced;
}
exports.debounce = debounce;