47 lines
968 B
TypeScript
47 lines
968 B
TypeScript
// Copyright 2021 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
import { reduce } from './iterables';
|
|
|
|
/**
|
|
* Like Lodash's `groupBy`, but returns a `Map`.
|
|
*/
|
|
export const groupBy = <T, ResultT>(
|
|
iterable: Iterable<T>,
|
|
fn: (value: T) => ResultT
|
|
): Map<ResultT, Array<T>> =>
|
|
reduce(
|
|
iterable,
|
|
(result: Map<ResultT, Array<T>>, value: T) => {
|
|
const key = fn(value);
|
|
const existingGroup = result.get(key);
|
|
if (existingGroup) {
|
|
existingGroup.push(value);
|
|
} else {
|
|
result.set(key, [value]);
|
|
}
|
|
return result;
|
|
},
|
|
new Map<ResultT, Array<T>>()
|
|
);
|
|
|
|
export const isEqual = <K, V>(
|
|
left: ReadonlyMap<K, V>,
|
|
right: ReadonlyMap<K, V>
|
|
): boolean => {
|
|
if (left.size !== right.size) {
|
|
return false;
|
|
}
|
|
|
|
for (const [key, value] of left) {
|
|
if (!right.has(key)) {
|
|
return false;
|
|
}
|
|
|
|
if (right.get(key) !== value) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
};
|