Skip to content

Commit b1c5ab7

Browse files
✔️ test: Make tests pass.
1 parent 65ab2ad commit b1c5ab7

File tree

4 files changed

+76
-7
lines changed

4 files changed

+76
-7
lines changed

package.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@
5252
"test": "ava",
5353
"travis": "npm run lint && npm run cover"
5454
},
55-
"dependencies": {},
55+
"dependencies": {
56+
"@aureooms/js-pairing-heap": "^1.0.0",
57+
"@aureooms/js-pairs": "^0.0.0"
58+
},
5659
"devDependencies": {
5760
"@aureooms/js-compare": "^1.4.8",
5861
"@babel/cli": "7.13.10",

src/kahn.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Kahn's algorithm.
3+
*
4+
* See https://en.wikipedia.org/wiki/Topological_sorting#CITEREFKahn1962
5+
*
6+
* @param {any} queue
7+
* @param {any} graph
8+
* @returns {Iterable<any>} The vertices in topological order.
9+
*/
10+
export default function* kahn(queue, graph) {
11+
while (true) {
12+
const u = queue.pop();
13+
if (u === undefined) break;
14+
yield u;
15+
for (const v of graph.rightOf(u)) {
16+
graph.delete([u, v]);
17+
if (graph.leftOf(v).next().done) {
18+
queue.push(v);
19+
}
20+
}
21+
}
22+
23+
if (graph.size > 0) {
24+
throw new Error('kahn: graph has at least one cycle');
25+
}
26+
}

src/sorted.js

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
import Heap from '@aureooms/js-pairing-heap';
2+
import {EfficientlyInvertiblePairs as Pairs} from '@aureooms/js-pairs';
3+
4+
import kahn from './kahn.js';
5+
16
/**
27
* Sort the vertices topologically breaking ties according to a given function.
38
*
@@ -6,11 +11,13 @@
611
* @returns {Iterable<any>} The vertices sorted in topological order.
712
*/
813
export default function sorted(edges, breakTies = (_a, _b) => -1) {
9-
const vertices = new Set();
10-
for (const [u, v] of edges) {
11-
vertices.add(u);
12-
vertices.add(v);
13-
}
14+
const graph = Pairs.from(edges);
15+
16+
const queue = new Heap(breakTies);
17+
const freeVertices = new Set();
18+
for (const [u] of graph) freeVertices.add(u);
19+
for (const [, v] of graph) freeVertices.delete(v);
20+
for (const u of freeVertices) queue.push(u);
1421

15-
return [...vertices].sort(breakTies)[Symbol.iterator]();
22+
return kahn(queue, graph);
1623
}

yarn.lock

+33
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,44 @@
22
# yarn lockfile v1
33

44

5+
"@aureooms/js-collections-deque@^4.0.1":
6+
version "4.0.1"
7+
resolved "https://registry.yarnpkg.com/@aureooms/js-collections-deque/-/js-collections-deque-4.0.1.tgz#bd8b827cdb597d061525c380dd704e338c77bd5f"
8+
integrity sha512-dktRVLyep0sUKpqgtG/JseA232KMdlu9t9ePq2wHcng1dZ3+63qW2C+FlKXBktrT1dU92DDxIL6PqnV97kHA1Q==
9+
dependencies:
10+
"@aureooms/js-error" "^4.0.1"
11+
512
"@aureooms/js-compare@^1.4.8":
613
version "1.4.8"
714
resolved "https://registry.yarnpkg.com/@aureooms/js-compare/-/js-compare-1.4.8.tgz#c6bff1091f4a2e211f449299572d9f195146fc59"
815
integrity sha512-Z26PU6OmuhS7ZJsELTKImmipF7J+KCOyN70wBhhVIhmqUhXY6C3JpJHAev6wNBkC4ThlQt3zO6p/OmBFIq76Qg==
916

17+
"@aureooms/js-error@^4.0.1":
18+
version "4.0.1"
19+
resolved "https://registry.yarnpkg.com/@aureooms/js-error/-/js-error-4.0.1.tgz#be2740b3f31a337e0828930c9b70d38113b4dd77"
20+
integrity sha512-zsgs6wmnRsKljlusewYiBaFBM/hIJp43b7OwE9ybpLEL4wfXjGP17cJTTAY8gpzALVFwEA5/flxIK0I6gJJLHQ==
21+
22+
"@aureooms/js-itertools@^4.1.0":
23+
version "4.1.0"
24+
resolved "https://registry.yarnpkg.com/@aureooms/js-itertools/-/js-itertools-4.1.0.tgz#c731eaee7de0005c6ea41f2f87cca4bdb2d86ca1"
25+
integrity sha512-P9TfwQPuXk5T5z6QMMfwLLyzh9QsEu4sGWcBk/P/waWgim/xqr+LDTOHVo7WU4QAty+/5CBX8DuW7MrPVfXt5A==
26+
dependencies:
27+
"@aureooms/js-collections-deque" "^4.0.1"
28+
"@aureooms/js-error" "^4.0.1"
29+
30+
"@aureooms/js-pairing-heap@^1.0.0":
31+
version "1.0.0"
32+
resolved "https://registry.yarnpkg.com/@aureooms/js-pairing-heap/-/js-pairing-heap-1.0.0.tgz#76429704ae5db8fd2c81a60352b87dab88b3d6b6"
33+
integrity sha512-lfaBSlUCIaxkYZXRwg7imCSeWS0AA8gFkV2CANaTuirB7hzLYdzPV8ePCw3MULZBdA2Ehq3CDGX2HxcqToZm7g==
34+
35+
"@aureooms/js-pairs@^0.0.0":
36+
version "0.0.0"
37+
resolved "https://registry.yarnpkg.com/@aureooms/js-pairs/-/js-pairs-0.0.0.tgz#a9d348c367511d4e70e166c73085ffc98c5fecf6"
38+
integrity sha512-zsyLmTpXZ2cQmVMCU1FnUIwiaaFEhZ9FiotgjVjsJLFhBoU+wIxykUyIDZXozRszQLnk5sa8gWIrnQ3azjQCUA==
39+
dependencies:
40+
"@aureooms/js-error" "^4.0.1"
41+
"@aureooms/js-itertools" "^4.1.0"
42+
1043
1144
version "7.13.10"
1245
resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.13.10.tgz#3a9254cbe806639c8ca4ebd49ebe54b4267b88c9"

0 commit comments

Comments
 (0)