Share utility functions from Timetable
Move the genereic pairs, enumerate and setEquals functions from Timetable to shared/utils/functions to make them available for reuse.
This commit is contained in:
parent
29b34deef0
commit
f550ca921b
2 changed files with 44 additions and 44 deletions
43
shared/utils/functions.ts
Normal file
43
shared/utils/functions.ts
Normal file
|
@ -0,0 +1,43 @@
|
|||
/** 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];
|
||||
}
|
||||
}
|
||||
|
||||
/** 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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue