Alexander Rose 1 год назад
Родитель
Сommit
e4396039fd
1 измененных файлов с 7 добавлено и 5 удалено
  1. 7 5
      src/mol-util/set.ts

+ 7 - 5
src/mol-util/set.ts

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2018-2023 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
@@ -15,9 +15,10 @@ export namespace SetUtils {
 
     /** Test if set a contains all elements of set b. */
     export function isSuperset<T>(setA: ReadonlySet<T>, setB: ReadonlySet<T>) {
+        if (setA.size < setB.size) return false;
         let flag = true;
         setB.forEach(elem => {
-            if (!setA.has(elem)) flag = false;
+            if (flag && !setA.has(elem)) flag = false;
         });
         return flag;
     }
@@ -39,7 +40,6 @@ export namespace SetUtils {
 
     export function unionMany<T>(...sets: ReadonlySet<T>[]) {
         if (sets.length === 0) return new Set<T>();
-        if (sets.length === 1) new Set(sets[0]);
         const union = new Set(sets[0]);
         for (let i = 1, il = sets.length; i < il; i++) {
             sets[i].forEach(elem => union.add(elem));
@@ -66,14 +66,16 @@ export namespace SetUtils {
     }
 
     export function areIntersecting<T>(setA: ReadonlySet<T>, setB: ReadonlySet<T>): boolean {
+        if (setA.size < setB.size) [setA, setB] = [setB, setA];
         let flag = false;
         setB.forEach(elem => {
-            if (setA.has(elem)) flag = true;
+            if (!flag && setA.has(elem)) flag = true;
         });
         return flag;
     }
 
     export function intersectionSize<T>(setA: ReadonlySet<T>, setB: ReadonlySet<T>): number {
+        if (setA.size < setB.size) [setA, setB] = [setB, setA];
         let count = 0;
         setB.forEach(elem => {
             if (setA.has(elem)) count += 1;
@@ -102,7 +104,7 @@ export namespace SetUtils {
         if (setA.size !== setB.size) return false;
         let flag = true;
         setB.forEach(elem => {
-            if (!setA.has(elem)) flag = false;
+            if (flag && !setA.has(elem)) flag = false;
         });
         return flag;
     }