36 lines
713 B
TypeScript
Executable File
36 lines
713 B
TypeScript
Executable File
export function createRafLoop(callback: () => void) {
|
|
let id: number | undefined;
|
|
|
|
function start() {
|
|
// Time updates are already in progress.
|
|
if (!isUndefined(id)) return;
|
|
loop();
|
|
}
|
|
|
|
function loop() {
|
|
id = window.requestAnimationFrame(function rafLoop() {
|
|
if (isUndefined(id)) return;
|
|
callback();
|
|
loop();
|
|
});
|
|
}
|
|
|
|
function stop() {
|
|
if (isNumber(id)) window.cancelAnimationFrame(id);
|
|
id = undefined;
|
|
}
|
|
|
|
return {
|
|
start,
|
|
stop,
|
|
};
|
|
}
|
|
|
|
function isUndefined(value: unknown): value is undefined {
|
|
return typeof value === 'undefined';
|
|
}
|
|
|
|
function isNumber(value: any): value is number {
|
|
return typeof value === 'number' && !Number.isNaN(value);
|
|
}
|