/**
 * Agrupa un array de elementos según una función de agrupamiento.
 * @param array Array de elementos.
 * @param fn Función que recibe un elemento y devuelve la clave de grupo.
 * @returns Objeto cuyas propiedades son claves de grupo y valores arrays de elementos.
 */
export function groupBy<T, K extends string | number>(
  array: T[],
  fn: (item: T) => K
): Record<K, T[]> {
  return array.reduce<Record<K, T[]>>((acc, item) => {
    const key = fn(item);
    if (!acc[key]) acc[key] = [];
    acc[key].push(item);
    return acc;
  }, {} as Record<K, T[]>);
}
