pragmatic-fp-ts
Version:
Opinionated functional programming library with easy use in mind
26 lines (20 loc) • 884 B
text/typescript
import { Equality, getValueOr, isNil } from "./main.ts";
const performGrouping = <A>(cmp: Equality<A>, elems: A[]) => {
const doGrouping = (grouped: A[][], group: A[], rest: A[]): A[][] => {
const [el, ...more] = rest;
const lastEl = group[group.length - 1];
return !isNil(el)
? cmp(lastEl, el)
? doGrouping(grouped, [...group, el], more)
: doGrouping([...grouped, group], [el], more)
: [...grouped, group];
};
return doGrouping([], [elems[0]], elems.slice(1));
};
export function groupWith<A>(isEqual: Equality<A>, coll: A[]): A[][];
export function groupWith<A>(isEqual: Equality<A>): (coll: A[]) => A[][];
export function groupWith<A>(isEqual: Equality<A>, coll?: A[]) {
if (arguments.length === 1)
return (theColl: A[]) => groupWith(isEqual, theColl);
else return performGrouping(isEqual, getValueOr([], coll as A[]));
}