observable.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import Task from '../task'
  7. import RuntimeContext from './runtime-context'
  8. interface Progress {
  9. taskId: number,
  10. elapsedMs: { real: number, cpu: number },
  11. tree: Progress.Node,
  12. tryAbort?: () => void
  13. }
  14. namespace Progress {
  15. export interface Node {
  16. readonly progress: Task.Progress,
  17. readonly children: ReadonlyArray<Node>
  18. }
  19. export interface Observer { (progress: Progress): void }
  20. }
  21. class ObservableExecutor {
  22. async run<T>(task: Task<T>): Promise<T> {
  23. const ctx = new ObservableRuntimeContext();
  24. if (!task.__onAbort) return task.__f(ctx);
  25. try {
  26. return await task.__f(ctx);
  27. } catch (e) {
  28. if (e === Task.Aborted) task.__onAbort();
  29. throw e;
  30. }
  31. }
  32. constructor(observer: Progress.Observer, updateRateMs: number) {
  33. }
  34. }
  35. class ObservableRuntimeContext implements RuntimeContext {
  36. id: number = 0;
  37. requiresUpdate: boolean = false;
  38. update(progress: Partial<RuntimeContext.ProgressUpdate>): Promise<void> {
  39. return 0 as any;
  40. }
  41. runChild<T>(progress: Partial<RuntimeContext.ProgressUpdate>, task: Task<T>): Promise<T> {
  42. return 0 as any;
  43. }
  44. }
  45. function ExecuteObservable<T>(task: Task<T>, observer: Progress.Observer, updateRateMs = 250) {
  46. return new ObservableExecutor(observer, updateRateMs).run(task);
  47. }
  48. namespace ExecuteObservable {
  49. export let PRINT_ERRORS_TO_CONSOLE = false;
  50. }
  51. export { ExecuteObservable, Progress }