Signal-Desktop/ts/util/mapUtil.ts

48 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;
};