releases-comm-central/chat/modules/NormalizedMap.jsm

42 строки
1.5 KiB
JavaScript

/* 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/. */
this.EXPORTED_SYMBOLS = ["NormalizedMap"];
/*
* 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.
*/
class NormalizedMap extends Map {
constructor(aNormalize, aIterable = []) {
if (typeof(aNormalize) != "function")
throw "NormalizedMap must have a normalize function!";
// Create the wrapped Map; use the provided iterable after normalizing the
// keys.
let 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;
}
};