export class PromiseCompleter { promise: Promise; resolve: (value?: R|PromiseLike) => void; reject: (error?: any, stackTrace?: string) => void; constructor() { this.promise = new Promise((res, rej) => { this.resolve = res; this.reject = rej; }); } } export class PromiseWrapper { static resolve(obj: T): Promise { return Promise.resolve(obj); } static reject(obj: any, _: any): Promise { return Promise.reject(obj); } // Note: We can't rename this method into `catch`, as this is not a valid // method name in Dart. static catchError(promise: Promise, onError: (error: any) => T | PromiseLike): Promise { return promise.catch(onError); } static all(promises: (T|Promise)[]): Promise { if (promises.length == 0) return Promise.resolve([]); return Promise.all(promises); } static then( promise: Promise, success: (value: T) => U | PromiseLike, rejection?: (error: any, stack?: any) => U | PromiseLike): Promise { return promise.then(success, rejection); } static wrap(computation: () => T): Promise { return new Promise((res, rej) => { try { res(computation()); } catch (e) { rej(e); } }); } static scheduleMicrotask(computation: () => any): void { PromiseWrapper.then(PromiseWrapper.resolve(null), computation, (_) => {}); } static isPromise(obj: any): boolean { return obj instanceof Promise; } static completer(): PromiseCompleter { return new PromiseCompleter(); } }