/** * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal */ import Task from '../task' import RuntimeContext from './runtime-context' interface Progress { taskId: number, elapsedMs: { real: number, cpu: number }, tree: Progress.Node, tryAbort?: () => void } namespace Progress { export interface Node { readonly progress: Task.Progress, readonly children: ReadonlyArray } export interface Observer { (progress: Progress): void } } class ObservableExecutor { async run(task: Task): Promise { const ctx = new ObservableRuntimeContext(); if (!task.__onAbort) return task.__f(ctx); try { return await task.__f(ctx); } catch (e) { if (e === Task.Aborted) task.__onAbort(); throw e; } } constructor(observer: Progress.Observer, updateRateMs: number) { } } class ObservableRuntimeContext implements RuntimeContext { id: number = 0; requiresUpdate: boolean = false; update(progress: Partial): Promise { return 0 as any; } runChild(progress: Partial, task: Task): Promise { return 0 as any; } } function ExecuteObservable(task: Task, observer: Progress.Observer, updateRateMs = 250) { return new ObservableExecutor(observer, updateRateMs).run(task); } namespace ExecuteObservable { export let PRINT_ERRORS_TO_CONSOLE = false; } export { ExecuteObservable, Progress }