import {TickingPromise} from '@avocado/core'; import {Collection} from './collection'; import {Traversal} from './traversal'; export class Traversals extends Collection('traversal') { parallel(context) { const results = this.traversals.map((traversal) => { return traversal.traverse(context); }); // Early out if no promises. if (!results.reduce((has, result) => { return has || result instanceof Promise; }, false)) { return results; } // Proxy any tickers. const tickableResults = results.filter((result) => { if (!(result instanceof TickingPromise)) { return false; } return true; }); // If none, just promise. if (0 === tickableResults.length) { return Promise.all(results); } // Otherwise, tick all tickers and resolve. return new TickingPromise( (resolve) => { resolve(Promise.all(results)); }, (elapsed) => { tickableResults.forEach((result) => result.tick(elapsed)); }, ); } }