// * Jolly Cobra's schedulers import { AnyToVoidFunction, NoneToVoidFunction } from "../types"; //type Scheduler = typeof requestAnimationFrame | typeof onTickEnd | typeof runNow; export function debounce( fn: F, ms: number, shouldRunFirst = true, shouldRunLast = true, ) { let waitingTimeout: number | null = null; return (...args: Parameters) => { if(waitingTimeout) { clearTimeout(waitingTimeout); waitingTimeout = null; } else if(shouldRunFirst) { // @ts-ignore fn(...args); } waitingTimeout = setTimeout(() => { if(shouldRunLast) { // @ts-ignore fn(...args); } waitingTimeout = null; }, ms) as any; }; } /* export function throttle( fn: F, ms: number, shouldRunFirst = true, ) { let interval: number | null = null; let isPending: boolean; let args: Parameters; return (..._args: Parameters) => { isPending = true; args = _args; if (!interval) { if (shouldRunFirst) { isPending = false; // @ts-ignore fn(...args); } interval = window.setInterval(() => { if (!isPending) { window.clearInterval(interval!); interval = null; return; } isPending = false; // @ts-ignore fn(...args); }, ms); } }; } */ /* export function throttleWithRaf(fn: F) { return throttleWith(fastRaf, fn); } export function throttleWithTickEnd(fn: F) { return throttleWith(onTickEnd, fn); } export function throttleWithNow(fn: F) { return throttleWith(runNow, fn); } export function throttleWith(schedulerFn: Scheduler, fn: F) { let waiting = false; let args: Parameters; return (..._args: Parameters) => { args = _args; if (!waiting) { waiting = true; schedulerFn(() => { waiting = false; // @ts-ignore fn(...args); }); } }; } export function onTickEnd(cb: NoneToVoidFunction) { Promise.resolve().then(cb); } function runNow(fn: NoneToVoidFunction) { fn(); } */ export const pause = (ms: number) => new Promise((resolve) => { setTimeout(resolve, ms); }); let fastRafCallbacks: NoneToVoidFunction[] | undefined; export function fastRaf(callback: NoneToVoidFunction) { if(!fastRafCallbacks) { fastRafCallbacks = [callback]; requestAnimationFrame(() => { const currentCallbacks = fastRafCallbacks!; fastRafCallbacks = undefined; currentCallbacks.forEach((cb) => cb()); }); } else { fastRafCallbacks.push(callback); } } export function superRaf() { return new Promise((resolve) => { window.requestAnimationFrame(() => { window.requestAnimationFrame(resolve); }); }); }