Mercurial > code > home > repos > streamed-graph
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); +}