--- /dev/null
+// Too weird for Flow
+"use strict";
+
+/**
+ * Create a collection of Maps that serve to contextualize a given node.
+ * This is useful to ensure that you only compare nodes that share a certain
+ * context.
+ *
+ * All nodes are initially contextualized by their input source.
+ * From there, you can contextualize them however you want.
+ *
+ * For a usage example, see `selector-no-descending-specificity`.
+ */
+module.exports = function() {
+ const contextMap = new Map();
+
+ return {
+ getContext(node) {
+ const nodeSource = node.source.input.from;
+ const baseContext = creativeGetMap(contextMap, nodeSource);
+ const subContexts = Array.from(arguments).slice(1);
+
+ return subContexts.reduce((result, context) => {
+ return creativeGetMap(result, context);
+ }, baseContext);
+ }
+ };
+};
+
+function creativeGetMap(someMap, someThing) {
+ if (!someMap.has(someThing)) {
+ someMap.set(someThing, new Map());
+ }
+ return someMap.get(someThing);
+}