diff options
Diffstat (limited to 'src/prelude/array.ts')
| -rw-r--r-- | src/prelude/array.ts | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/prelude/array.ts b/src/prelude/array.ts index 54f7081712..8536e486d6 100644 --- a/src/prelude/array.ts +++ b/src/prelude/array.ts @@ -18,6 +18,10 @@ export function erase<T>(x: T, xs: T[]): T[] { return xs.filter(y => x !== y); } +export function setDifference<T>(xs: T[], ys: T[]): T[] { + return xs.filter(x => !ys.includes(x)); +} + export function unique<T>(xs: T[]): T[] { return [...new Set(xs)]; } @@ -25,3 +29,19 @@ export function unique<T>(xs: T[]): T[] { export function sum(xs: number[]): number { return xs.reduce((a, b) => a + b, 0); } + +export function groupBy<T>(f: (x: T, y: T) => boolean, xs: T[]): T[][] { + const groups = [] as T[][]; + for (const x of xs) { + if (groups.length !== 0 && f(groups[groups.length - 1][0], x)) { + groups[groups.length - 1].push(x); + } else { + groups.push([x]); + } + } + return groups; +} + +export function groupOn<T, S>(f: (x: T) => S, xs: T[]): T[][] { + return groupBy((a, b) => f(a) === f(b), xs); +} |