avocado-old/packages/behavior/item/traversals.js

41 lines
1.0 KiB
JavaScript
Raw Normal View History

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