1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.topologicalSort = void 0;
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 | function topologicalSort(xs, keyFn, depFn) {
|
19 | const remaining = new Map();
|
20 | for (const element of xs) {
|
21 | const key = keyFn(element);
|
22 | remaining.set(key, { key, element, dependencies: depFn(element) });
|
23 | }
|
24 | const ret = new Array();
|
25 | while (remaining.size > 0) {
|
26 |
|
27 | const selectable = Array.from(remaining.values()).filter((e) => e.dependencies.every((d) => !remaining.has(d)));
|
28 | selectable.sort((a, b) => (a.key < b.key ? -1 : b.key < a.key ? 1 : 0));
|
29 | ret.push(selectable.map((s) => s.element));
|
30 | for (const selected of selectable) {
|
31 | remaining.delete(selected.key);
|
32 | }
|
33 |
|
34 | if (selectable.length === 0) {
|
35 | throw new Error(`Could not determine ordering between: ${Array.from(remaining.keys()).join(', ')}`);
|
36 | }
|
37 | }
|
38 | return ret;
|
39 | }
|
40 | exports.topologicalSort = topologicalSort;
|
41 |
|
\ | No newline at end of file |