{"version":3,"file":"util.mjs","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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","sourcesContent":["import { Handle } from './interfaces';\nimport { createHandle } from './lang';\n\n/**\n * Wraps a setTimeout call in a handle, allowing the timeout to be cleared by calling destroy.\n *\n * @param callback Callback to be called when the timeout elapses\n * @param delay Number of milliseconds to wait before calling the callback\n * @return Handle which can be destroyed to clear the timeout\n */\nexport function createTimer(callback: (...args: any[]) => void, delay?: number): Handle {\n\tlet timerId: number | null = setTimeout(callback, delay);\n\n\treturn createHandle(function() {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t\ttimerId = null;\n\t\t}\n\t});\n}\n\n/**\n * Wraps a callback, returning a function which fires after no further calls are received over a set interval.\n *\n * @param callback Callback to wrap\n * @param delay Number of milliseconds to wait after any invocations before calling the original callback\n * @return Debounced function\n */\nexport function debounce<T extends (this: any, ...args: any[]) => void>(callback: T, delay: number): T {\n\t// node.d.ts clobbers setTimeout/clearTimeout with versions that return/receive NodeJS.Timer,\n\t// but browsers return/receive a number\n\tlet timer: Handle | null;\n\n\treturn <T>function() {\n\t\ttimer && timer.destroy();\n\n\t\tlet context = this;\n\t\tlet args: IArguments | null = arguments;\n\n\t\ttimer = guaranteeMinimumTimeout(function() {\n\t\t\tcallback.apply(context, args);\n\t\t\targs = context = timer = null;\n\t\t}, delay);\n\t};\n}\n\n/**\n * Wraps a callback, returning a function which fires at most once per set interval.\n *\n * @param callback Callback to wrap\n * @param delay Number of milliseconds to wait before allowing the original callback to be called again\n * @return Throttled function\n */\nexport function throttle<T extends (this: any, ...args: any[]) => void>(callback: T, delay: number): T {\n\tlet ran: boolean | null;\n\n\treturn <T>function() {\n\t\tif (ran) {\n\t\t\treturn;\n\t\t}\n\n\t\tran = true;\n\n\t\tcallback.apply(this, arguments);\n\t\tguaranteeMinimumTimeout(function() {\n\t\t\tran = null;\n\t\t}, delay);\n\t};\n}\n\n/**\n * Like throttle, but calls the callback at the end of each interval rather than the beginning.\n * Useful for e.g. resize or scroll events, when debounce would appear unresponsive.\n *\n * @param callback Callback to wrap\n * @param delay Number of milliseconds to wait before calling the original callback and allowing it to be called again\n * @return Throttled function\n */\nexport function throttleAfter<T extends (this: any, ...args: any[]) => void>(callback: T, delay: number): T {\n\tlet ran: boolean | null;\n\n\treturn <T>function() {\n\t\tif (ran) {\n\t\t\treturn;\n\t\t}\n\n\t\tran = true;\n\n\t\tlet context = this;\n\t\tlet args: IArguments | null = arguments;\n\n\t\tguaranteeMinimumTimeout(function() {\n\t\t\tcallback.apply(context, args);\n\t\t\targs = context = ran = null;\n\t\t}, delay);\n\t};\n}\n\nexport function guaranteeMinimumTimeout(callback: (...args: any[]) => void, delay?: number): Handle {\n\tconst startTime = Date.now();\n\tlet timerId: number | null;\n\n\tfunction timeoutHandler() {\n\t\tconst delta = Date.now() - startTime;\n\t\tif (delay == null || delta >= delay) {\n\t\t\tcallback();\n\t\t} else {\n\t\t\t// Cast setTimeout return value to fix TypeScript parsing bug.  Without it,\n\t\t\t// it thinks we are using the Node version of setTimeout.\n\t\t\t// Revisit this with the next TypeScript update.\n\t\t\t// Set another timer for the mount of time that we came up short.\n\t\t\ttimerId = <any>setTimeout(timeoutHandler, delay - delta);\n\t\t}\n\t}\n\ttimerId = setTimeout(timeoutHandler, delay);\n\treturn createHandle(() => {\n\t\tif (timerId != null) {\n\t\t\tclearTimeout(timerId);\n\t\t\ttimerId = null;\n\t\t}\n\t});\n}\n"]}