import { IterableActivity, Source, isSource } from "./activity"; export type GroupFn = (row: T, index: number) => number | string; export type GroupRow = { key: string, value: T[] }; function groupGen(groupFn: GroupFn): IterableActivity> { return function* (source: Source) { let i = -1; const group: { [key: string]: T[] } = {}; for (const row of source) { const key = groupFn(row, ++i); if (!group[key]) { group[key] = []; } group[key].push(row); } for (const key in group) { yield { key, value: group[key] }; } }; } export function group(groupByFn: GroupFn): IterableActivity>; export function group(source: Source, groupByFn: GroupFn): IterableIterator>; export function group(s_or_gbf: Source | GroupFn, groupByFn?: GroupFn): IterableActivity> | IterableIterator> { return isSource(s_or_gbf) ? groupGen(groupByFn!)(s_or_gbf) : groupGen(s_or_gbf); }