UNPKG

@dvcol/common-utils

Version:

Typescript library for common utility functions and constants

82 lines (77 loc) 2.3 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// lib/common/utils/debounce.utils.ts function debounce(func, delay = 250, timout = { value: void 0 }, cancel) { const timeoutId = timout; let resolve; let reject; let promise; const previous = []; const clear = () => { if (timeoutId.value === void 0) return; clearTimeout(timeoutId.value); const result = _optionalChain([cancel, 'optionalCall', _ => _(...previous)]); timeoutId.value = void 0; previous.length = 0; return result; }; const finish = () => { timeoutId.value = void 0; previous.length = 0; promise = void 0; }; const fn = async (...args) => { if (!promise) ({ resolve, reject, promise } = Promise.withResolvers()); clear(); previous.push(...args); timeoutId.value = setTimeout(async () => { try { const result = await func(...args); resolve(result); } catch (error) { reject(error); } finally { finish(); } }, delay); return promise; }; Object.defineProperties(fn, { cancel: { value: clear }, timeout: { get: () => timeoutId.value }, resolve: { value: (value) => { resolve(value); finish(); } }, reject: { value: (error) => { reject(error); finish(); } }, previous: { get: () => previous }, promise: { get: () => promise } }); return fn; } function useDebounce({ fn, cancel, delay = 250, timeout = { value: void 0 } }) { const debounced = debounce(fn, delay, timeout, cancel); return { debounce: debounced, cancel: debounced.cancel }; } exports.debounce = debounce; exports.useDebounce = useDebounce;