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; } // Otherwise, wrap in a promise. const tpromise = new TickingPromise((resolve, reject) => { return Promise.all(results); }); // Proxy all ticks. const tickableResults = results.filter((result) => { if (!(result instanceof TickingPromise)) return false; if ('function' !== typeof result.ticker) return false; return true; }); if (tickableResults.length > 0) { tpromise.ticker = (elapsed) => { tickableResults.forEach((result) => result.ticker(elapsed)); }; } return tpromise; } }