signal-desktop/ts/util/setUtil.ts
2023-11-14 14:05:17 -08:00

40 lines
928 B
TypeScript

// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { every } from './iterables';
const add = <T>(set: Readonly<Set<T>>, item: T): Set<T> =>
new Set(set).add(item);
export const remove = <T>(
set: Readonly<Set<T>>,
...items: ReadonlyArray<T>
): Set<T> => {
const clone = new Set(set);
for (const item of items) {
clone.delete(item);
}
return clone;
};
export const toggle = <T>(
set: Readonly<Set<T>>,
item: Readonly<T>,
shouldInclude: boolean
): Set<T> => (shouldInclude ? add : remove)(set, item);
export const isEqual = (
a: Readonly<Set<unknown>>,
b: Readonly<Set<unknown>>
): boolean => a === b || (a.size === b.size && every(a, item => b.has(item)));
export const difference = <T>(
a: Readonly<Set<T>>,
b: Readonly<Set<T>>
): Set<T> => {
const result = new Set([...a]);
for (const item of b) {
result.delete(item);
}
return result;
};