From 4a4e1396852607d88af1928649086366e3b69d46 Mon Sep 17 00:00:00 2001
From: Brady James Garvin <bgarvin@cse.unl.edu>
Date: Wed, 16 Oct 2019 10:31:42 -0500
Subject: [PATCH] Updated lab for 2019.

---
 .eslintrc                           |  3 +++
 js/distances.js                     | 25 ++++++++++++++++++++-----
 js/graphs.js                        |  4 +---
 js/queue.js                         |  4 +---
 js/searches.js                      | 11 ++++++-----
 js/stack.js                         |  4 +---
 js/topological_sort.js              | 27 +++++++++++++++++++++++----
 unit_tests/test_distances.js        |  7 +++++--
 unit_tests/test_topological_sort.js |  7 +++++--
 unit_tests/unit_tests.html          | 12 ++----------
 10 files changed, 67 insertions(+), 37 deletions(-)

diff --git a/.eslintrc b/.eslintrc
index ec0d68b..15eefba 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 1b848a5..d42907a 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 2a8b3c0..892575f 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 8b05cce..9f45117 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 ce19294..5d63265 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 e5612f2..f87a910 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 a35147b..3b8f1bf 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 bf4b05a..71545ef 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 2c35574..d9788a1 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 e69abb6..c9d2d74 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>
-- 
GitLab