2019-03-17 23:45:48 -05:00
|
|
|
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;
|
|
|
|
}
|
2019-09-08 05:34:17 -05:00
|
|
|
// Proxy any tickers.
|
2019-03-17 23:45:48 -05:00
|
|
|
const tickableResults = results.filter((result) => {
|
2019-09-08 05:34:17 -05:00
|
|
|
if (!(result instanceof TickingPromise)) {
|
|
|
|
return false;
|
|
|
|
}
|
2019-03-17 23:45:48 -05:00
|
|
|
return true;
|
|
|
|
});
|
2019-09-08 05:34:17 -05:00
|
|
|
// If none, just promise.
|
|
|
|
if (0 === tickableResults.length) {
|
|
|
|
return Promise.all(results);
|
2019-03-17 23:45:48 -05:00
|
|
|
}
|
2019-09-08 05:34:17 -05:00
|
|
|
// Otherwise, tick all tickers and resolve.
|
|
|
|
return new TickingPromise(
|
|
|
|
(resolve) => {
|
|
|
|
resolve(Promise.all(results));
|
|
|
|
},
|
|
|
|
(elapsed) => {
|
|
|
|
tickableResults.forEach((result) => result.tick(elapsed));
|
|
|
|
},
|
|
|
|
);
|
2019-03-17 23:45:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|