67 lines
1.7 KiB
JavaScript
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;
|