From 9e2e77d4ee9e00000fc3a8265c53ca0db5a571d9 Mon Sep 17 00:00:00 2001 From: mrkishi Date: Fri, 29 Nov 2019 18:43:49 -0300 Subject: [PATCH 1/2] disable `@typescript-eslint/prefer-interface` --- .eslintrc.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index c8ec8d1d01..946a157e40 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -36,7 +36,8 @@ module.exports = { } ], '@typescript-eslint/no-object-literal-type-assertion': 'off', - '@typescript-eslint/no-unused-vars': 'off' + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/prefer-interface': 'off' }, globals: { globalThis: false From 2fcfe2547e342c9dcc199d1544372de10d1cd9dc Mon Sep 17 00:00:00 2001 From: mrkishi Date: Fri, 29 Nov 2019 14:06:24 -0300 Subject: [PATCH 2/2] use raf's time for smoother transitions --- src/runtime/internal/loop.ts | 41 +++++++++++++++++++----------------- test/runtime/index.js | 2 +- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/runtime/internal/loop.ts b/src/runtime/internal/loop.ts index c1a42aa724..33e519732f 100644 --- a/src/runtime/internal/loop.ts +++ b/src/runtime/internal/loop.ts @@ -1,39 +1,42 @@ -import { now, raf } from './environment'; +import { raf } from './environment'; export interface Task { abort(): void; promise: Promise } -const tasks = new Set(); -let running = false; +type TaskCallback = (now: number) => boolean | void; +type TaskEntry = { c: TaskCallback; f: () => void }; -function run_tasks() { +const tasks = new Set(); + +function run_tasks(now: number) { tasks.forEach(task => { - if (!task[0](now())) { + if (!task.c(now)) { tasks.delete(task); - task[1](); + task.f(); } }); - running = tasks.size > 0; - if (running) raf(run_tasks); + if (tasks.size !== 0) raf(run_tasks); } +/** + * For testing purposes only! + */ export function clear_loops() { - // for testing... - tasks.forEach(task => tasks.delete(task)); - running = false; + tasks.clear(); } -export function loop(fn: (number) => void): Task { - let task; +/** + * Creates a new task that runs on each raf frame + * until it returns a falsy value or is aborted + */ +export function loop(callback: TaskCallback): Task { + let task: TaskEntry; - if (!running) { - running = true; - raf(run_tasks); - } + if (tasks.size === 0) raf(run_tasks); return { - promise: new Promise(fulfil => { - tasks.add(task = [fn, fulfil]); + promise: new Promise(fulfill => { + tasks.add(task = { c: callback, f: fulfill }); }), abort() { tasks.delete(task); diff --git a/test/runtime/index.js b/test/runtime/index.js index fc989d352f..60bd70a5d9 100644 --- a/test/runtime/index.js +++ b/test/runtime/index.js @@ -107,7 +107,7 @@ describe("runtime", () => { set_raf(cb => { raf.callback = () => { raf.callback = null; - cb(); + cb(raf.time); flush(); }; });