« get me outta code hell

content: generateCoverCarousel - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/util/sugar.js
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2023-06-23 19:41:15 -0300
committer(quasar) nebula <qznebula@protonmail.com>2023-06-23 19:41:38 -0300
commit89e79008b02331b69660bb16b6ca737e37483e61 (patch)
tree90d24e41e72f72bb3e9898d52c19aad323456bdd /src/util/sugar.js
parentd7bd80239dead1179450b2a0b97f97c59e150905 (diff)
content: generateCoverCarousel
This also introduces a handy stitchArrays() utility, which
probably has some uses not caught in this commit.
Diffstat (limited to 'src/util/sugar.js')
-rw-r--r--src/util/sugar.js32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/util/sugar.js b/src/util/sugar.js
index 3a7e6f8..5f54c3b 100644
--- a/src/util/sugar.js
+++ b/src/util/sugar.js
@@ -73,6 +73,38 @@ export function accumulateSum(array, fn = x => x) {
     0);
 }
 
+// Stitches together the items of separate arrays into one array of objects
+// whose keys are the corresponding items from each array at that index.
+// This is mostly useful for iterating over multiple arrays at once!
+export function stitchArrays(keyToArray) {
+  const errors = [];
+
+  for (const [key, value] of Object.entries(keyToArray)) {
+    if (!Array.isArray(value)) {
+      errors.push(new TypeError(`(${key}) Expected array, got ${value}`));
+    }
+  }
+
+  if (!empty(errors)) {
+    throw new AggregateError(errors, `Expected all values to be arrays`);
+  }
+
+  const keys = Object.keys(keyToArray);
+  const arrays = Object.values(keyToArray);
+  const length = Math.max(...arrays.map(({length}) => length));
+  const results = [];
+
+  for (let i = 0; i < length; i++) {
+    const object = {};
+    for (const key of keys) {
+      object[key] = keyToArray[key][i];
+    }
+    results.push(object);
+  }
+
+  return results;
+}
+
 export const mapInPlace = (array, fn) =>
   array.splice(0, array.length, ...array.map(fn));