diff options
Diffstat (limited to 'popperjs/package/lib/utils/orderModifiers.js')
-rw-r--r-- | popperjs/package/lib/utils/orderModifiers.js | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/popperjs/package/lib/utils/orderModifiers.js b/popperjs/package/lib/utils/orderModifiers.js new file mode 100644 index 0000000..82572bc --- /dev/null +++ b/popperjs/package/lib/utils/orderModifiers.js @@ -0,0 +1,44 @@ +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; + })); + }, []); +}
\ No newline at end of file |