44 lines
1.2 KiB
Plaintext
44 lines
1.2 KiB
Plaintext
import { modifierPhases } from "../enums.js"; // source: https://stackoverflow.com/questions/49875255
|
|
|
|
function order(modifiers) {
|
|
var map = new Map();
|
|
var visited = new Set();
|
|
var result = [];
|
|
modifiers.forEach(function (modifier) {
|
|
map.set(modifier.name, modifier);
|
|
}); // On visiting object, check for its dependencies and visit them recursively
|
|
|
|
function sort(modifier) {
|
|
visited.add(modifier.name);
|
|
var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
|
|
requires.forEach(function (dep) {
|
|
if (!visited.has(dep)) {
|
|
var depModifier = map.get(dep);
|
|
|
|
if (depModifier) {
|
|
sort(depModifier);
|
|
}
|
|
}
|
|
});
|
|
result.push(modifier);
|
|
}
|
|
|
|
modifiers.forEach(function (modifier) {
|
|
if (!visited.has(modifier.name)) {
|
|
// check for visited object
|
|
sort(modifier);
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
|
|
export default function orderModifiers(modifiers) {
|
|
// order based on dependencies
|
|
var orderedModifiers = order(modifiers); // order based on phase
|
|
|
|
return modifierPhases.reduce(function (acc, phase) {
|
|
return acc.concat(orderedModifiers.filter(function (modifier) {
|
|
return modifier.phase === phase;
|
|
}));
|
|
}, []);
|
|
} |