Merge branch 'DRVWEB-4389-small-fixes-public-page' into 'main'
[ProtonMail-WebClient.git] / packages / utils / groupWith.ts
blob6f6615c0ddf50539daf4d5ff078d57032b161a5a
1 /**
2  * Groups elements in an array by a provided comparison function.
3  * E.g. `[1, 1, 2, 3, 3] => [[1, 1], [2], [3, 3]]`
4  */
5 const groupWith = <T>(compare: (a: T, b: T) => boolean, arr: T[] = []) => {
6     const { groups } = arr.reduce<{ groups: T[][]; remaining: T[] }>(
7         (acc, a) => {
8             const { groups, remaining } = acc;
9             const group = remaining.filter((b) => compare(a, b));
11             if (group.length) {
12                 acc.groups = [...groups, group];
13                 acc.remaining = remaining.filter((b) => !compare(a, b));
14                 return acc;
15             }
17             return acc;
18         },
19         { groups: [], remaining: arr }
20     );
21     return groups;
24 export default groupWith;