« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/find.js44
1 files changed, 26 insertions, 18 deletions
diff --git a/src/find.js b/src/find.js
index 64e5f63d..d647419a 100644
--- a/src/find.js
+++ b/src/find.js
@@ -320,6 +320,8 @@ function findMixedHelper(config) {
     specKeys = tokens.map(token => token[findTokenKey]),
     specs = specKeys.map(specKey => findFindSpec(specKey));
 
+  const cache = new WeakMap();
+
   return (fullRef, data, {mode = 'warn'} = {}) => {
     if (!fullRef) return null;
 
@@ -331,29 +333,35 @@ function findMixedHelper(config) {
       throw new TypeError(`Expected data to be present`);
     }
 
-    // TODO: Cache stuff below by identity of data
+    let subcache = cache.get(data);
+    if (!subcache) {
+      const byName = Object.create(null);
+      const multipleNameMatches = Object.create(null);
 
-    const byName = Object.create(null);
-    const multipleNameMatches = Object.create(null);
+      for (const spec of specs) {
+        processAvailableMatchesByName(data, {
+          ...spec,
 
-    for (const spec of specs) {
-      processAvailableMatchesByName(data, {
-        ...spec,
+          results: byName,
+          multipleNameMatches,
+        });
+      }
 
-        results: byName,
-        multipleNameMatches,
-      });
+      const byDirectory =
+        Object.fromEntries(
+          stitchArrays({
+            referenceType: keys,
+            spec: specs,
+          }).map(({referenceType, spec}) => [
+              referenceType,
+              processAvailableMatchesByDirectory(data, spec).results,
+            ]));
+
+      subcache = {byName, multipleNameMatches, byDirectory};
+      cache.set(data, subcache);
     }
 
-    const byDirectory =
-      Object.fromEntries(
-        stitchArrays({
-          referenceType: keys,
-          spec: specs,
-        }).map(({referenceType, spec}) => [
-            referenceType,
-            processAvailableMatchesByDirectory(data, spec).results,
-          ]));
+    const {byName, multipleNameMatches, byDirectory} = subcache;
 
     return matchHelper(fullRef, mode, {
       matchByDirectory: (referenceType, directory) => {