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