update
This commit is contained in:
7
dist_ts/dettle/debounce.d.ts
vendored
Normal file
7
dist_ts/dettle/debounce.d.ts
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
import type { FN, Debounced } from './types.js';
|
||||
declare const debounce: <Args extends unknown[]>(fn: FN<Args, unknown>, wait?: number, options?: {
|
||||
leading?: boolean;
|
||||
trailing?: boolean;
|
||||
maxWait?: number;
|
||||
}) => Debounced<Args>;
|
||||
export default debounce;
|
92
dist_ts/dettle/debounce.js
Normal file
92
dist_ts/dettle/debounce.js
Normal file
@ -0,0 +1,92 @@
|
||||
/* IMPORT */
|
||||
/* MAIN */
|
||||
const debounce = (fn, wait = 1, options) => {
|
||||
/* VARIABLES */
|
||||
wait = Math.max(1, wait);
|
||||
const leading = options?.leading ?? false;
|
||||
const trailing = options?.trailing ?? true;
|
||||
const maxWait = Math.max(options?.maxWait ?? Infinity, wait);
|
||||
let args;
|
||||
let timeout;
|
||||
let timestampCall = 0;
|
||||
let timestampInvoke = 0;
|
||||
/* HELPERS */
|
||||
const getInstantData = () => {
|
||||
const timestamp = Date.now();
|
||||
const elapsedCall = timestamp - timestampCall;
|
||||
const elapsedInvoke = timestamp - timestampInvoke;
|
||||
const isInvoke = (elapsedCall >= wait || elapsedInvoke >= maxWait);
|
||||
return [timestamp, isInvoke];
|
||||
};
|
||||
const invoke = (timestamp) => {
|
||||
timestampInvoke = timestamp;
|
||||
if (!args)
|
||||
return; // This should never happen
|
||||
const _args = args;
|
||||
args = undefined;
|
||||
fn.apply(undefined, _args);
|
||||
};
|
||||
const onCancel = () => {
|
||||
resetTimeout(0);
|
||||
};
|
||||
const onFlush = () => {
|
||||
if (!timeout)
|
||||
return;
|
||||
onCancel();
|
||||
invoke(Date.now());
|
||||
};
|
||||
const onLeading = (timestamp) => {
|
||||
timestampInvoke = timestamp;
|
||||
if (leading)
|
||||
return invoke(timestamp);
|
||||
};
|
||||
const onTrailing = (timestamp) => {
|
||||
if (trailing && args)
|
||||
return invoke(timestamp);
|
||||
args = undefined;
|
||||
};
|
||||
const onTimeout = () => {
|
||||
timeout = undefined;
|
||||
const [timestamp, isInvoking] = getInstantData();
|
||||
if (isInvoking)
|
||||
return onTrailing(timestamp);
|
||||
return updateTimeout(timestamp);
|
||||
};
|
||||
const updateTimeout = (timestamp) => {
|
||||
const elapsedCall = timestamp - timestampCall;
|
||||
const elapsedInvoke = timestamp - timestampInvoke;
|
||||
const remainingCall = wait - elapsedCall;
|
||||
const remainingInvoke = maxWait - elapsedInvoke;
|
||||
const ms = Math.min(remainingCall, remainingInvoke);
|
||||
return resetTimeout(ms);
|
||||
};
|
||||
const resetTimeout = (ms) => {
|
||||
if (timeout)
|
||||
clearTimeout(timeout);
|
||||
if (ms <= 0)
|
||||
return;
|
||||
timeout = setTimeout(onTimeout, ms);
|
||||
};
|
||||
/* DEBOUNCED */
|
||||
const debounced = (...argsLatest) => {
|
||||
const [timestamp, isInvoking] = getInstantData();
|
||||
const hadTimeout = !!timeout;
|
||||
args = argsLatest;
|
||||
timestampCall = timestamp;
|
||||
if (isInvoking || !timeout)
|
||||
resetTimeout(wait);
|
||||
if (isInvoking) {
|
||||
if (!hadTimeout)
|
||||
return onLeading(timestamp);
|
||||
return invoke(timestamp);
|
||||
}
|
||||
};
|
||||
/* DEBOUNCED UTILITIES */
|
||||
debounced.cancel = onCancel;
|
||||
debounced.flush = onFlush;
|
||||
/* RETURN */
|
||||
return debounced;
|
||||
};
|
||||
/* EXPORT */
|
||||
export default debounce;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVib3VuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXR0bGUvZGVib3VuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsWUFBWTtBQUlaLFVBQVU7QUFFVixNQUFNLFFBQVEsR0FBRyxDQUEyQixFQUFxQixFQUFFLE9BQWUsQ0FBQyxFQUFFLE9BQXFFLEVBQW9CLEVBQUU7SUFFOUssZUFBZTtJQUVmLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFHLENBQUMsRUFBRSxJQUFJLENBQUUsQ0FBQztJQUU1QixNQUFNLE9BQU8sR0FBRyxPQUFPLEVBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQztJQUMxQyxNQUFNLFFBQVEsR0FBRyxPQUFPLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQztJQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksUUFBUSxFQUFFLElBQUksQ0FBRSxDQUFDO0lBRWhFLElBQUksSUFBc0IsQ0FBQztJQUMzQixJQUFJLE9BQWtELENBQUM7SUFDdkQsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztJQUV4QixhQUFhO0lBRWIsTUFBTSxjQUFjLEdBQUcsR0FBc0IsRUFBRTtRQUU3QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFHLENBQUM7UUFDOUIsTUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLGFBQWEsQ0FBQztRQUM5QyxNQUFNLGFBQWEsR0FBRyxTQUFTLEdBQUcsZUFBZSxDQUFDO1FBQ2xELE1BQU0sUUFBUSxHQUFHLENBQUUsV0FBVyxJQUFJLElBQUksSUFBSSxhQUFhLElBQUksT0FBTyxDQUFFLENBQUM7UUFFckUsT0FBTyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUUvQixDQUFDLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxDQUFFLFNBQWlCLEVB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
|
3
dist_ts/dettle/index.d.ts
vendored
Normal file
3
dist_ts/dettle/index.d.ts
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
import debounce from './debounce.js';
|
||||
import throttle from './throttle.js';
|
||||
export { debounce, throttle };
|
6
dist_ts/dettle/index.js
Normal file
6
dist_ts/dettle/index.js
Normal file
@ -0,0 +1,6 @@
|
||||
/* IMPORT */
|
||||
import debounce from './debounce.js';
|
||||
import throttle from './throttle.js';
|
||||
/* EXPORT */
|
||||
export { debounce, throttle };
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXR0bGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsWUFBWTtBQUVaLE9BQU8sUUFBUSxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFFckMsWUFBWTtBQUVaLE9BQU8sRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMifQ==
|
6
dist_ts/dettle/throttle.d.ts
vendored
Normal file
6
dist_ts/dettle/throttle.d.ts
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
import type { FN, Throttled } from './types.js';
|
||||
declare const throttle: <Args extends unknown[]>(fn: FN<Args, unknown>, wait?: number, options?: {
|
||||
leading?: boolean;
|
||||
trailing?: boolean;
|
||||
}) => Throttled<Args>;
|
||||
export default throttle;
|
13
dist_ts/dettle/throttle.js
Normal file
13
dist_ts/dettle/throttle.js
Normal file
@ -0,0 +1,13 @@
|
||||
/* IMPORT */
|
||||
import debounce from './debounce.js';
|
||||
/* MAIN */
|
||||
const throttle = (fn, wait = 1, options) => {
|
||||
return debounce(fn, wait, {
|
||||
maxWait: wait,
|
||||
leading: options?.leading ?? true,
|
||||
trailing: options?.trailing ?? true
|
||||
});
|
||||
};
|
||||
/* EXPORT */
|
||||
export default throttle;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyb3R0bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXR0bGUvdGhyb3R0bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsWUFBWTtBQUVaLE9BQU8sUUFBUSxNQUFNLGVBQWUsQ0FBQztBQUdyQyxVQUFVO0FBRVYsTUFBTSxRQUFRLEdBQUcsQ0FBMkIsRUFBcUIsRUFBRSxPQUFlLENBQUMsRUFBRSxPQUFtRCxFQUFvQixFQUFFO0lBRTVKLE9BQU8sUUFBUSxDQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUU7UUFDMUIsT0FBTyxFQUFFLElBQUk7UUFDYixPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJO1FBQ2pDLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLElBQUk7S0FDcEMsQ0FBQyxDQUFDO0FBRUwsQ0FBQyxDQUFDO0FBRUYsWUFBWTtBQUVaLGVBQWUsUUFBUSxDQUFDIn0=
|
11
dist_ts/dettle/types.d.ts
vendored
Normal file
11
dist_ts/dettle/types.d.ts
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
type Callback = () => void;
|
||||
type FN<Args extends unknown[], Return> = (...args: Args) => Return;
|
||||
type Debounced<Args extends unknown[]> = FN<Args, void> & {
|
||||
cancel: Callback;
|
||||
flush: Callback;
|
||||
};
|
||||
type Throttled<Args extends unknown[]> = FN<Args, void> & {
|
||||
cancel: Callback;
|
||||
flush: Callback;
|
||||
};
|
||||
export type { Callback, FN, Debounced, Throttled };
|
3
dist_ts/dettle/types.js
Normal file
3
dist_ts/dettle/types.js
Normal file
@ -0,0 +1,3 @@
|
||||
/* MAIN */
|
||||
export {};
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXR0bGUvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsVUFBVSJ9
|
Reference in New Issue
Block a user