48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
/** Returns a tuple consisting of a running index starting from 0, and the item of the iterable */
|
|
export function* enumerate<T>(iterable: Iterable<T>) {
|
|
let index = 0;
|
|
for (const item of iterable) {
|
|
yield [index++, item] as [number, T];
|
|
}
|
|
}
|
|
|
|
/** Converts a name to an id */
|
|
export function toId(name: string) {
|
|
return name.toLowerCase().replace(/[^a-z0-9]+/g, "-");
|
|
}
|
|
|
|
/** Returns adjacent pairs from iterable */
|
|
export function* pairs<T>(iterable: Iterable<T>) {
|
|
let first;
|
|
let second;
|
|
for (const [index, item] of enumerate(iterable)) {
|
|
[first, second] = [second, item];
|
|
if (index >= 1) {
|
|
yield [first, second] as [T, T];
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
Returns true if all sets are equal
|
|
@param sets set to compare
|
|
@returns true if all sets are the same size and have the same elements
|
|
*/
|
|
export function setEquals<T>(...sets: Set<T>[]) {
|
|
if (sets.length < 2) {
|
|
throw TypeError("At least two sets must be passed to setEquals");
|
|
}
|
|
const ref = sets[0];
|
|
const rest = sets.slice(1);
|
|
if (rest.some(set => set.size !== ref.size)) {
|
|
return false;
|
|
}
|
|
for (const set of rest) {
|
|
for (const el of set) {
|
|
if (!ref.has(el)) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|