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 c30c1ed50acf71fe36003a35d5bb0296041c5817..0ec5e46286bcedbe52368558ac49653d55e56519 100644 |
--- a/sdk/lib/_internal/pub/lib/src/utils.dart |
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart |
@@ -284,48 +284,50 @@ Iterable<Pair> pairs(Iterable iter) { |
}); |
} |
-/// Creates a map from [iter], using the return values of [keyFn] as the keys |
-/// and the return values of [valueFn] as the values. |
-Map listToMap(Iterable iter, keyFn(element), valueFn(element)) { |
- var map = new Map(); |
- for (var element in iter) { |
- map[keyFn(element)] = valueFn(element); |
- } |
- return map; |
-} |
- |
/// Creates a new map from [map] with new keys and values. |
/// |
-/// The return values of [keyFn] are used as the keys and the return values of |
-/// [valueFn] are used as the values for the new map. |
-Map mapMap(Map map, keyFn(key, value), valueFn(key, value)) => |
- listToMap(map.keys, |
- (key) => keyFn(key, map[key]), |
- (key) => valueFn(key, map[key])); |
- |
-/// Creates a new map from [map] with the same keys. |
+/// The return values of [key] are used as the keys and the return values of |
+/// [value] are used as the values for the new map. |
/// |
-/// The return values of [valueFn] are used as the values for the new map. |
-Map mapMapValues(Map map, fn(key, value)) => mapMap(map, (key, _) => key, fn); |
+/// [key] defaults to returning the original key and [value] defaults to |
+/// returning the original value. |
+Map mapMap(Map map, {key(key, value), value(key, value)}) { |
+ if (key == null) key = (key, _) => key; |
+ if (value == null) value = (_, value) => value; |
+ |
+ var result = {}; |
+ map.forEach((mapKey, mapValue) { |
+ result[key(mapKey, mapValue)] = value(mapKey, mapValue); |
+ }); |
+ return result; |
+} |
+ |
+/// Like [Map.fromIterable], but [key] and [value] may return [Future]s. |
+Future<Map> mapFromIterableAsync(Iterable iter, {key(element), |
+ value(element)}) { |
+ if (key == null) key = (element) => element; |
+ if (value == null) value = (element) => element; |
-/// Like [listToMap], but [keyFn] and [valueFn] may return [Future]s. |
-Future<Map> listToMapAsync(Iterable iter, keyFn(element), valueFn(element)) { |
var map = new Map(); |
return Future.wait(iter.map((element) { |
return Future.wait([ |
- syncFuture(() => keyFn(element)), |
- syncFuture(() => valueFn(element)) |
+ syncFuture(() => key(element)), |
+ syncFuture(() => value(element)) |
]).then((results) { |
map[results[0]] = results[1]; |
}); |
})).then((_) => map); |
} |
-/// Like [mapMap], but [keyFn] and [valueFn] may return [Future]s. |
-Future<Map> mapMapAsync(Map map, keyFn(key, value), valueFn(key, value)) => |
- listToMapAsync(map.keys, |
- (key) => keyFn(key, map[key]), |
- (key) => valueFn(key, map[key])); |
+/// Like [mapMap], but [key] and [value] may return [Future]s. |
+Future<Map> mapMapAsync(Map map, {key(key, value), value(key, value)}) { |
+ if (key == null) key = (key, _) => key; |
+ if (value == null) value = (_, value) => value; |
+ |
+ return mapFromIterableAsync(map.keys, |
+ key: (mapKey) => key(mapKey, map[mapKey]), |
+ value: (mapKey) => value(mapKey, map[mapKey])); |
+} |
/// Returns the shortest path from [start] to [end] in [graph]. |
/// |
@@ -338,7 +340,7 @@ List shortestPath(Map<dynamic, Iterable> graph, start, end) { |
// Dijkstra's algorithm. |
var infinity = graph.length; |
- var distance = mapMapValues(graph, (_1, _2) => infinity); |
+ 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]. |