summaryrefslogtreecommitdiffstats
path: root/comm/chat/modules/NormalizedMap.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'comm/chat/modules/NormalizedMap.sys.mjs')
-rw-r--r--comm/chat/modules/NormalizedMap.sys.mjs48
1 files changed, 48 insertions, 0 deletions
diff --git a/comm/chat/modules/NormalizedMap.sys.mjs b/comm/chat/modules/NormalizedMap.sys.mjs
new file mode 100644
index 0000000000..863de6874f
--- /dev/null
+++ b/comm/chat/modules/NormalizedMap.sys.mjs
@@ -0,0 +1,48 @@
+/* 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.
+ 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;
+ }
+}