view src/layout/algorithm.ts @ 143:5adf79d4a9f4

release v0.11.0
author drewp@bigasterisk.com
date Mon, 08 May 2023 13:29:48 -0700
parents 2e8fa3fec0c8
children
line wrap: on
line source

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);
}