/* This file is part of the Notesnook project (https://notesnook.com/) Copyright (C) 2023 Streetwriters (Private) Limited This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* eslint-disable @typescript-eslint/no-explicit-any */ interface DebouncedFunction< Args extends any[], F extends (...args: Args) => any > { (this: ThisParameterType, ...args: Args & Parameters): void; } interface DebouncedFunctionWithId< Args extends any[], F extends (...args: Args) => any > { ( this: ThisParameterType, id: string | number, ...args: Args & Parameters ): void; } export function debounce void>( func: F, waitFor: number ): DebouncedFunction { let timeout: number | null; return (...args: Args) => { if (timeout) clearTimeout(timeout); timeout = setTimeout(() => func(...args), waitFor) as unknown as number; }; } export function debounceWithId< Args extends any[], F extends (...args: Args) => void >(func: F, waitFor: number): DebouncedFunctionWithId { let timeout: number | null; let debounceId: string | number | null = null; return (id: string | number, ...args: Parameters) => { if (timeout && id === debounceId) clearTimeout(timeout); debounceId = id; timeout = setTimeout(() => { func(...args); }, waitFor) as unknown as number; }; } const DEBOUNCE_TIMEOUTS: Record = {}; export function inlineDebounce(id: string, func: () => void, waitFor: number) { clearTimeout(DEBOUNCE_TIMEOUTS[id]); DEBOUNCE_TIMEOUTS[id] = setTimeout(func, waitFor); }