export const groupBy = ( array: T[], predicate: (value: T, index: number, array: T[]) => string, ) => array.reduce( (acc, value, index, array) => { (acc[predicate(value, index, array)] ||= []).push(value); return acc; }, {} as { [key: string]: T[] }, ); export const groupByToMap = ( array: T[], predicate: (value: T, index: number, array: T[]) => Q, ) => array.reduce((map, value, index, array) => { const key = predicate(value, index, array); map.get(key)?.push(value) ?? map.set(key, [value]); return map; }, new Map());