export function flatten(arr: any[]): T[] { return arr.reduce(function (flat, toFlatten) { return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten); }, []); } export function indexBy(arr: T[], key: keyof T | ((item: T) => string)): Record { const result: Record = {}; for (const item of arr) { const k = typeof key === "function" ? key(item) : item[key]; if (typeof k === "string") { result[k] = item; } } return result; } export function groupBy(arr: T[], key: keyof T | ((item: T) => string)): Record { const result: Record = {}; for (const item of arr) { const k = typeof key === "function" ? key(item) : item[key]; if (typeof k === "string") { if (!result[k]) result[k] = []; result[k].push(item); } } return result; }