| Index: sdk/lib/_internal/pub/lib/src/utils.dart
|
| diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
|
| index 0ec5e46286bcedbe52368558ac49653d55e56519..8ebc8fe8ec62ebeda14d1fe25ccbcf7dda6cb9d1 100644
|
| --- a/sdk/lib/_internal/pub/lib/src/utils.dart
|
| +++ b/sdk/lib/_internal/pub/lib/src/utils.dart
|
| @@ -6,7 +6,6 @@
|
| library pub.utils;
|
|
|
| import 'dart:async';
|
| -import "dart:collection";
|
| import "dart:convert";
|
| import 'dart:io';
|
| import 'dart:isolate';
|
| @@ -329,69 +328,9 @@ Future<Map> mapMapAsync(Map map, {key(key, value), value(key, value)}) {
|
| value: (mapKey) => value(mapKey, map[mapKey]));
|
| }
|
|
|
| -/// Returns the shortest path from [start] to [end] in [graph].
|
| -///
|
| -/// The graph is represented by a map where each key is a vertex and the value
|
| -/// is the set of other vertices directly reachable from the key. [start] and
|
| -/// [end] must be vertices in this graph.
|
| -List shortestPath(Map<dynamic, Iterable> graph, start, end) {
|
| - assert(graph.containsKey(start));
|
| - assert(graph.containsKey(end));
|
| -
|
| - // Dijkstra's algorithm.
|
| - var infinity = graph.length;
|
| - var distance = mapMap(graph, value: (_1, _2) => infinity);
|
| -
|
| - // A map from each node to the node that came before it on the shortest path
|
| - // from it back to [start].
|
| - var previous = {};
|
| -
|
| - distance[start] = 0;
|
| - var remaining = graph.keys.toSet();
|
| - while (!remaining.isEmpty) {
|
| - var current = minBy(remaining, (node) => distance[node]);
|
| - remaining.remove(current);
|
| -
|
| - // If there's no remaining node that's reachable from [start], then there's
|
| - // no path from [start] to [end].
|
| - if (distance[current] == infinity) return null;
|
| -
|
| - // If we've reached [end], we've found the shortest path to it and we just
|
| - // need to reconstruct that path.
|
| - if (current == end) break;
|
| -
|
| - for (var neighbor in graph[current]) {
|
| - if (!remaining.contains(neighbor)) continue;
|
| - var newDistance = distance[current] + 1;
|
| - if (newDistance >= distance[neighbor]) continue;
|
| - distance[neighbor] = newDistance;
|
| - previous[neighbor] = current;
|
| - }
|
| - }
|
| -
|
| - var path = new Queue();
|
| - var current = end;
|
| - while (current != null) {
|
| - path.addFirst(current);
|
| - current = previous[current];
|
| - }
|
| -
|
| - return path.toList();
|
| -}
|
| -
|
| -/// Returns a copy of [graph] with all the edges reversed.
|
| -///
|
| -/// The graph is represented by a map where each key is a vertex and the value
|
| -/// is the set of other vertices directly reachable from the key.
|
| -Map<dynamic, Set> reverseGraph(Map<dynamic, Set> graph) {
|
| - var reversed = new Map.fromIterable(graph.keys, value: (_) => new Set());
|
| - graph.forEach((vertex, edges) {
|
| - for (var edge in edges) {
|
| - reversed[edge].add(vertex);
|
| - }
|
| - });
|
| - return reversed;
|
| -}
|
| +/// Returns the maximum value in [iter].
|
| +int maxAll(Iterable<int> iter) =>
|
| + iter.reduce((max, element) => element > max ? element : max);
|
|
|
| /// Replace each instance of [matcher] in [source] with the return value of
|
| /// [fn].
|
|
|