Convert src/runtime/internal/loop.ts to JavaScript

pull/8569/head
S. Elliott Johnson 3 years ago
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…
Cancel
Save