interface Task { (): void } interface IdleCallback { timeRemaining(): number } declare function requestIdleCallback(cb: (id: IdleCallback) => void): number function batch() { const taskQueue = new Array() let scheduled = false function run(id: IdleCallback) { scheduled = false while (id.timeRemaining() > 0 && taskQueue.length > 0) { const task = taskQueue.shift() if (task) task() } schedule() } function schedule() { if (!scheduled && taskQueue.length > 0) { scheduled = true requestIdleCallback(run) } } return (task: Task) { taskQueue.push(task) schedule() } }