diff src/layout/algorithm.ts @ 122:2e8fa3fec0c8

support joining subjects into wider rows
author drewp@bigasterisk.com
date Sun, 20 Mar 2022 14:12:03 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/layout/algorithm.ts	Sun Mar 20 14:12:03 2022 -0700
@@ -0,0 +1,46 @@
+import Immutable from "immutable";
+
+export function addToValues<K, V>(
+  imap: Immutable.Map<K, V[]>,
+  key: K,
+  newValue: V): Immutable.Map<K, V[]> {
+  let cur = imap.get(key, undefined);
+  let ret = imap;
+  if (cur === undefined) {
+    cur = [];
+    ret = imap.set(key, cur);
+  }
+  cur.push(newValue);
+  return ret;
+}
+
+export function multiColumnSort<T>(
+  elems: T[],
+  makeSortCols: (elem: T, index: number) => Array<number | string>): T[] {
+  const tagged = elems.map((p, i) => {
+    return {
+      sort: makeSortCols(p, i),
+      val: p
+    };
+  });
+  tagged.sort((e1, e2) => {
+    let index = 0;
+    for (let k1 of e1.sort) {
+      const k2 = e2.sort[index];
+      if (!Immutable.is(k1, k2)) {
+        if (typeof k1 === "number") {
+          if (typeof k2 === "number") {
+            return k1 - k2;
+          } else {
+            throw new Error(`${k1} vs ${k2}`);
+          }
+        } else {
+          return k1.localeCompare(k2 as string);
+        }
+      }
+      index++;
+    }
+    return 0;
+  });
+  return tagged.map((e) => e.val);
+}