You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

43 lines
1.2 KiB

  1. import { modifierPhases } from "../enums.js"; // source: https://stackoverflow.com/questions/49875255
  2. function order(modifiers) {
  3. var map = new Map();
  4. var visited = new Set();
  5. var result = [];
  6. modifiers.forEach(function (modifier) {
  7. map.set(modifier.name, modifier);
  8. }); // On visiting object, check for its dependencies and visit them recursively
  9. function sort(modifier) {
  10. visited.add(modifier.name);
  11. var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
  12. requires.forEach(function (dep) {
  13. if (!visited.has(dep)) {
  14. var depModifier = map.get(dep);
  15. if (depModifier) {
  16. sort(depModifier);
  17. }
  18. }
  19. });
  20. result.push(modifier);
  21. }
  22. modifiers.forEach(function (modifier) {
  23. if (!visited.has(modifier.name)) {
  24. // check for visited object
  25. sort(modifier);
  26. }
  27. });
  28. return result;
  29. }
  30. export default function orderModifiers(modifiers) {
  31. // order based on dependencies
  32. var orderedModifiers = order(modifiers); // order based on phase
  33. return modifierPhases.reduce(function (acc, phase) {
  34. return acc.concat(orderedModifiers.filter(function (modifier) {
  35. return modifier.phase === phase;
  36. }));
  37. }, []);
  38. }