const set = (x: Iterable = []): Set => x instanceof Set ? x : new Set(x); const and = (a: Iterable, b: Iterable): Set => { const A = set(a); const B = set(b); return set([...A].filter(x => B.has(x))); }; const or = (a: Iterable, b: Iterable): Set => set([...a, ...b]); const not = (a: Iterable, b: Iterable): Set => { const A = set(a); const B = set(b); return set([...A].filter(x => !B.has(x))); }; const xor = (a: Iterable, b: Iterable): Set => not(or(a, b), and(a, b)); const equal = (a: Iterable, b: Iterable): boolean => { const A = set(a); const B = set(b); return A.size === B.size && [...A].every(x => B.has(x)); }; const subset = (a: Iterable, b: Iterable): boolean => { const A = set(a); const B = set(b); return [...A].every(x => B.has(x)); }; const strictSubset = (a: Iterable, b: Iterable): boolean => { const A = set(a); const B = set(b); return A.size < B.size && [...A].every(x => B.has(x)); }; const superset = (a: Iterable, b: Iterable): boolean => subset(b, a); const strictSuperset = (a: Iterable, b: Iterable): boolean => strictSubset(b, a); const intersects = (a: Iterable, b: Iterable): boolean => and(a, b).size > 0; export { set, and, and as intersection, or, or as union, not, not as subtract, not as difference, xor, equal, subset, strictSubset, superset, strictSuperset, intersects };