package funkin.util.tools; /** * A static extension which provides utility functions for Maps. * * For example, add `using MapTools` then call `map.values()`. * * @see https://haxe.org/manual/lf-static-extension.html */ class MapTools { /** * Return the quantity of keys in the map. */ public static function size(map:Map):Int { return map.keys().array().length; } /** * Return a list of values from the map, as an array. */ public static function values(map:Map):Array { return [for (i in map.iterator()) i]; } /** * Create a new array with all elements of the given array, to prevent modifying the original. */ public static function clone(map:Map):Map { return map.copy(); } /** * Create a new map which is a combination of the two given maps. * @param a The base map. * @param b The other map. The values from this take precedence. * @return The combined map. */ public static function merge(a:Map, b:Map):Map { var result = a.copy(); for (pair in b.keyValueIterator()) { result.set(pair.key, pair.value); } return result; } /** * Create a new array with clones of all elements of the given array, to prevent modifying the original. */ public static function deepClone>(map:Map):Map { // TODO: This function does NOT work. throw "Not implemented"; /* var newMap:Map = []; // Replace each value with a clone of itself. for (key in newMap.keys()) { newMap.set(key, newMap.get(key).clone()); } return newMap; */ } /** * Return a list of keys from the map (as an array, rather than an iterator). * TODO: Rename this? */ public static function keyValues(map:Map):Array { return map.keys().array(); } }