diff --git a/.eslintrc b/.eslintrc index ec0d68b9b851aecd5fed5b8c2c7b6c87f52f46f9..15eefba00ead3e95099b0064fe507a5cdc2e93e8 100755 --- a/.eslintrc +++ b/.eslintrc @@ -4,6 +4,9 @@ "browser": true, "jquery": true, }, + "parserOptions": { + "sourceType": "module", + }, "rules": { "no-await-in-loop": "warn", "no-compare-neg-zero": "warn", diff --git a/js/distances.js b/js/distances.js index 1b848a5a3f73bd1df5b01f11e9c91a198790f7b7..d42907a3a35f7b15275622e25a387cd565ee8171 100644 --- a/js/distances.js +++ b/js/distances.js @@ -1,7 +1,22 @@ -/* exported getDistances */ -/* globals BasicQueue */ +import {BasicQueue} from './queue.js'; -function getDistances(graph, source) { - const result = new Map(); - return result; // stub +export function getDistances(graph, source) { + // TODO: This code has been copied from searches.js, but still needs to be modified. + const backpointers = new Map(); + const worklist = new BasicQueue(); + worklist.insert([undefined, source]); + while (worklist.size > 0) { + const [from, to] = worklist.remove(); + if (backpointers.has(to)) { + continue; + } + backpointers.set(to, from); + if (to === destination) { + break; + } + for (const neighbor of graph.getNeighbors(to)) { + worklist.insert([to, neighbor]); + } + } + return backpointers; } diff --git a/js/graphs.js b/js/graphs.js index 2a8b3c0febc124f567c81adefe6921d4ce731c84..892575f56bd1b34c03a3e6f78a2c9c88c9fe503b 100644 --- a/js/graphs.js +++ b/js/graphs.js @@ -1,6 +1,4 @@ -/* exported Graph */ - -class Graph { +export class Graph { constructor() { this.neighbors = new Map(); } diff --git a/js/queue.js b/js/queue.js index 8b05cced74a2ef671d0e871915b968a5be0c8ecc..9f45117ef2c499c64e728e90e0aea577d12718ba 100644 --- a/js/queue.js +++ b/js/queue.js @@ -1,6 +1,4 @@ -/* exported BasicQueue */ - -class BasicQueue { +export class BasicQueue { constructor() { this.elements = []; this.head = 0; diff --git a/js/searches.js b/js/searches.js index ce19294580f7820fb3a2bf78c23233dc8129269e..5d632653b1a418748c3ff7fa57c60ca71f2644a0 100644 --- a/js/searches.js +++ b/js/searches.js @@ -1,7 +1,8 @@ -/* exported dfs bfs fullDFS */ -/* globals BasicStack BasicQueue */ +import './utility.js'; +import {BasicStack} from './stack.js'; +import {BasicQueue} from './queue.js'; -function dfs(graph, source, destination) { +export function dfs(graph, source, destination) { const backpointers = new Map(); const worklist = new BasicStack(); worklist.insert([undefined, source]); @@ -25,7 +26,7 @@ function dfs(graph, source, destination) { return path.reverse(); } -function bfs(graph, source, destination) { +export function bfs(graph, source, destination) { const backpointers = new Map(); const worklist = new BasicQueue(); worklist.insert([undefined, source]); @@ -49,7 +50,7 @@ function bfs(graph, source, destination) { return path.reverse(); } -function fullDFS(graph) { +export function fullDFS(graph) { const backpointers = new Map(); for (const source of graph.vertices) { if (!backpointers.has(source)) { diff --git a/js/stack.js b/js/stack.js index e5612f27318a331677fec2d8adddc764f20af2bb..f87a910e1b2e60ec9c4b9105bc0d3d3e52223135 100644 --- a/js/stack.js +++ b/js/stack.js @@ -1,6 +1,4 @@ -/* exported BasicStack */ - -class BasicStack { +export class BasicStack { constructor() { this.elements = []; } diff --git a/js/topological_sort.js b/js/topological_sort.js index a35147b30c2ea5ea150b027ddba1a4cb192a4417..3b8f1bf2417e3f7e1867277069723fc0aa2f1bd6 100644 --- a/js/topological_sort.js +++ b/js/topological_sort.js @@ -1,5 +1,5 @@ -/* exported topologicalSort */ -/* globals BasicStack */ +import './utility.js'; +import {BasicStack} from './stack.js'; class Finish { constructor(vertex) { @@ -7,7 +7,26 @@ class Finish { } } -function topologicalSort(graph) { +export function topologicalSort(graph) { const result = []; - return result; // stub + // TODO: This code has been copied from searches.js, but still needs to be modified. + const backpointers = new Map(); + for (const source of graph.vertices) { + if (!backpointers.has(source)) { + const worklist = new BasicStack(); + worklist.insert([undefined, source]); + while (worklist.size > 0) { + const workitem = worklist.remove(); + const [from, to] = workitem; + if (backpointers.has(to)) { + continue; + } + backpointers.set(to, from); + for (const neighbor of graph.getNeighbors(to)) { + worklist.insert([to, neighbor]); + } + } + } + } + return result; } diff --git a/unit_tests/test_distances.js b/unit_tests/test_distances.js index bf4b05a065e9a626acee687aa6c213e6153448fd..71545ef92646b68340f32199d48ca745c624d2e0 100644 --- a/unit_tests/test_distances.js +++ b/unit_tests/test_distances.js @@ -1,5 +1,8 @@ -QUnit.module('distances.js'); -/* globals QUnit Graph getDistances */ +import {Graph} from '../js/graphs.js'; +import {getDistances} from '../js/distances.js'; + +/* globals QUnit */ +QUnit.module('test_distances.js'); /* eslint-disable no-magic-numbers */ QUnit.test('measure distances in random undirected graph #0', (assert) => { diff --git a/unit_tests/test_topological_sort.js b/unit_tests/test_topological_sort.js index 2c35574cbcf95af155b550063d7d4d037b97b56b..d9788a1af8b62673e56cbd7c05db31fbe658a37e 100644 --- a/unit_tests/test_topological_sort.js +++ b/unit_tests/test_topological_sort.js @@ -1,5 +1,8 @@ -QUnit.module('topological_sort.js'); -/* globals QUnit Graph topologicalSort */ +import {Graph} from '../js/graphs.js'; +import {topologicalSort} from '../js/topological_sort.js'; + +/* globals QUnit */ +QUnit.module('test_topological_sort.js'); /* eslint-disable no-magic-numbers */ QUnit.test('topologically sort random directed graph #0', (assert) => { diff --git a/unit_tests/unit_tests.html b/unit_tests/unit_tests.html index e69abb658414947e07dd66c999bc88f9017f2cae..c9d2d7479583ccad8224c3f4c1395ac2b82127da 100644 --- a/unit_tests/unit_tests.html +++ b/unit_tests/unit_tests.html @@ -13,16 +13,8 @@ <script src="../libraries/qunit/qunit.js"></script> <script src="overrides.js"></script> - <script src="../js/utility.js"></script> - <script src="../js/stack.js"></script> - <script src="../js/queue.js"></script> - <script src="../js/graphs.js"></script> - - <script src="../js/distances.js"></script> - <script src="test_distances.js"></script> - - <script src="../js/topological_sort.js"></script> - <script src="test_topological_sort.js"></script> + <script type="module" src="test_distances.js"></script> + <script type="module" src="test_topological_sort.js"></script> </body> </html>