37 lines
1.0 KiB
JavaScript
37 lines
1.0 KiB
JavaScript
|
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;
|
||
|
}
|
||
|
|
||
|
}
|