{"version":3,"file":"debounce.mjs","names":[],"sources":["../src/debounce.ts"],"sourcesContent":["import { assert } from \"./assert.ts\";\nimport type { Fn, TimerId } from \"./types.ts\";\n\nexport function debounce<TParams extends Array<unknown>, TThisContext>(\n\tcallback: Fn<TParams, void, TThisContext>,\n\tdelay: number,\n): Fn<TParams, void, TThisContext> {\n\tassert(Number.isSafeInteger(delay) && delay > 0, \"Delay must be positive integer.\");\n\n\tlet timer: TimerId | null = null;\n\tlet lastCalledTimestamp: number;\n\n\tlet context: TThisContext;\n\tlet args: TParams;\n\n\tfunction invoke() {\n\t\tconst delta = performance.now() - lastCalledTimestamp;\n\n\t\tif (delta < delay) {\n\t\t\ttimer = setTimeout(invoke, delay - delta);\n\t\t} else {\n\t\t\ttimer = null;\n\t\t\tcallback.apply(context, args);\n\t\t}\n\t}\n\n\treturn function (this: TThisContext, ...params: TParams) {\n\t\tlastCalledTimestamp = performance.now();\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-this-alias\n\t\tcontext = this;\n\t\targs = params;\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n\t\tif (timer == null) {\n\t\t\ttimer = setTimeout(invoke, delay);\n\t\t}\n\t};\n}\n"],"mappings":";;;AAGA,SAAgB,SACf,UACA,OACkC;AAClC,QAAO,OAAO,cAAc,MAAM,IAAI,QAAQ,GAAG,kCAAkC;CAEnF,IAAI,QAAwB;CAC5B,IAAI;CAEJ,IAAI;CACJ,IAAI;CAEJ,SAAS,SAAS;EACjB,MAAM,QAAQ,YAAY,KAAK,GAAG;AAElC,MAAI,QAAQ,MACX,SAAQ,WAAW,QAAQ,QAAQ,MAAM;OACnC;AACN,WAAQ;AACR,YAAS,MAAM,SAAS,KAAK;;;AAI/B,QAAO,SAA8B,GAAG,QAAiB;AACxD,wBAAsB,YAAY,KAAK;AAGvC,YAAU;AACV,SAAO;AAGP,MAAI,SAAS,KACZ,SAAQ,WAAW,QAAQ,MAAM"}