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

pull/8569/head
S. Elliott Johnson 3 years ago
parent 048ae8f32e
commit 3ae44e612b

@ -1,42 +1,36 @@
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) {
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) => { tasks.forEach((task) => {
if (!task.c(now)) { if (!task.c(now)) {
tasks.delete(task); tasks.delete(task);
task.f(); task.f();
} }
}); });
if (tasks.size !== 0)
if (tasks.size !== 0) raf(run_tasks); 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); if (tasks.size === 0)
raf(run_tasks);
return { return {
promise: new Promise((fulfill) => { promise: new Promise((fulfill) => {
tasks.add((task = { c: callback, f: fulfill })); tasks.add((task = { c: callback, f: fulfill }));
@ -46,3 +40,11 @@ export function loop(callback: TaskCallback): Task {
} }
}; };
} }
/** @typedef {(now: number) => boolean | void} TaskCallback */
/** @typedef {{ c: TaskCallback; f: () => void }} TaskEntry */
/** @typedef {Object} Task
* @property {Promise<void>} promise
*/
Loading…
Cancel
Save