Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | 94x 94x 2422x 2422x 2422x 2408x 2408x 2422x 94x 5296x 5167x 129x 129x 65x 65x 53x 53x 53x 94x 274x 274x | /** * @module Utils */ import * as MH from "@lisn/globals/minification-helpers"; /** * @category Tasks */ export type SchedulerPostTaskOptions = { delay?: number; priority?: TaskPriority; signal?: AbortSignal; }; /** * @category Tasks */ export type Scheduler = { postTask<T, P extends readonly unknown[] | []>( callback: (...params: P) => T, options?: SchedulerPostTaskOptions, ...args: P ): Promise<T>; }; /** * @category Tasks */ export type TaskPriority = "user-blocking" | "user-visible" | "background"; /* eslint-disable-next-line no-var */ declare var scheduler: Scheduler; /** * Schedules a task with high priority to be executed as soon as possible. * * It uses {@link https://developer.mozilla.org/en-US/docs/Web/API/Scheduler/postTask | Scheduler:postTask} * if available, otherwise falls back to * {@link https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel | MessageChannel}. * * @category Tasks */ export const scheduleHighPriorityTask = (task: () => void) => { Iif (typeof scheduler !== "undefined") { scheduler.postTask(task, { priority: "user-blocking", }); } else { // Fallback to MessageChannel const channel = new MessageChannel(); channel.port1.onmessage = () => { channel.port1.close(); task(); }; channel.port2.postMessage(""); } }; /** * Returns a wrapper around the given handler that is debounced by the given * debounce window. * * @category Tasks */ export const getDebouncedHandler = <Args extends unknown[]>( debounceWindow: number, handler: (...args: Args) => void, ) => { if (!debounceWindow) { return handler; } let timer: ReturnType<typeof setTimeout> | null = null; let lastArgs: Args; return (...args: Args) => { lastArgs = args; if (timer === null) { timer = MH.setTimer(async () => { await handler(...lastArgs); timer = null; }, debounceWindow); } }; }; /** * Returns a promise that resolves at least the given number of delay (in * milliseconds) later. Uses `setTimeout`. * * @category Tasks */ export const waitForDelay = (delay?: number) => MH.newPromise<void>((resolve) => { MH.setTimer(resolve, delay); }); |