mirror of https://github.com/sveltejs/svelte
parent
048ae8f32e
commit
3ae44e612b
@ -1,48 +1,50 @@
|
|||||||
import { raf } from './environment';
|
import { raf } from './environment';
|
||||||
|
const tasks = new Set();
|
||||||
export interface Task {
|
/** @param {number} now
|
||||||
abort(): void;
|
* @returns {void}
|
||||||
promise: Promise<void>;
|
*/
|
||||||
}
|
function run_tasks(now) {
|
||||||
|
tasks.forEach((task) => {
|
||||||
type TaskCallback = (now: number) => boolean | void;
|
if (!task.c(now)) {
|
||||||
type TaskEntry = { c: TaskCallback; f: () => void };
|
tasks.delete(task);
|
||||||
|
task.f();
|
||||||
const tasks = new Set<TaskEntry>();
|
}
|
||||||
|
});
|
||||||
function run_tasks(now: number) {
|
if (tasks.size !== 0)
|
||||||
tasks.forEach((task) => {
|
raf(run_tasks);
|
||||||
if (!task.c(now)) {
|
|
||||||
tasks.delete(task);
|
|
||||||
task.f();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (tasks.size !== 0) raf(run_tasks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For testing purposes only!
|
* For testing purposes only!
|
||||||
|
* @returns {void}
|
||||||
*/
|
*/
|
||||||
export function clear_loops() {
|
export function clear_loops() {
|
||||||
tasks.clear();
|
tasks.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new task that runs on each raf frame
|
* Creates a new task that runs on each raf frame
|
||||||
* until it returns a falsy value or is aborted
|
* until it returns a falsy value or is aborted
|
||||||
|
* @param {TaskCallback} callback
|
||||||
|
* @returns {import("/Users/elliottjohnson/dev/sveltejs/svelte/loop.ts-to-jsdoc").Task}
|
||||||
*/
|
*/
|
||||||
export function loop(callback: TaskCallback): Task {
|
export function loop(callback) {
|
||||||
let task: TaskEntry;
|
/** @type {TaskEntry} */
|
||||||
|
let task;
|
||||||
|
if (tasks.size === 0)
|
||||||
|
raf(run_tasks);
|
||||||
|
return {
|
||||||
|
promise: new Promise((fulfill) => {
|
||||||
|
tasks.add((task = { c: callback, f: fulfill }));
|
||||||
|
}),
|
||||||
|
abort() {
|
||||||
|
tasks.delete(task);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
if (tasks.size === 0) raf(run_tasks);
|
|
||||||
|
|
||||||
return {
|
/** @typedef {(now: number) => boolean | void} TaskCallback */
|
||||||
promise: new Promise((fulfill) => {
|
/** @typedef {{ c: TaskCallback; f: () => void }} TaskEntry */
|
||||||
tasks.add((task = { c: callback, f: fulfill }));
|
|
||||||
}),
|
/** @typedef {Object} Task
|
||||||
abort() {
|
* @property {Promise<void>} promise
|
||||||
tasks.delete(task);
|
*/
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
Loading…
Reference in new issue