Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/*
* A Map that automatically normalizes keys before accessing the values.
*
* The constructor takes two parameters:
* aNormalize: A function which takes a string and returns the "normalized"
* version of it.
* aIterable: A iterable to prefill the map with, keys will be normalized.
*
* Returns a Map object that will automatically run aNormalize on any operations
* involving keys.
*/
export class NormalizedMap extends Map {
constructor(aNormalize, aIterable = []) {
if (typeof aNormalize != "function") {
throw new Error("NormalizedMap must have a normalize function!");
}
// Create the wrapped Map; use the provided iterable after normalizing the
// keys.
const entries = [...aIterable].map(([key, val]) => [aNormalize(key), val]);
super(entries);
// Note: In derived classes, super() must be called before using 'this'.
this._normalize = aNormalize;
}
// Dummy normalize function.
_normalize(aKey) {
return aKey;
}
// Anything that accepts a key as an input needs to be manually overridden.
delete(key) {
return super.delete(this._normalize(key));
}
get(key) {
return super.get(this._normalize(key));
}
has(key) {
return super.has(this._normalize(key));
}
set(key, val) {
super.set(this._normalize(key), val);
return this;
}
}