diff --git a/src/mol-data/int/impl/ordered-set.ts b/src/mol-data/int/impl/ordered-set.ts index 762ae81477a86ba2243981fae6629cdc693cea50..52d6f8362de4aa9e1684c5a1467300215a4333a5 100644 --- a/src/mol-data/int/impl/ordered-set.ts +++ b/src/mol-data/int/impl/ordered-set.ts @@ -19,7 +19,7 @@ export const ofBounds = I.ofBounds; export function ofSortedArray(xs: Nums): OrderedSetImpl { if (!xs.length) return Empty; // check if the array is just a range - if (xs[xs.length - 1] - xs[0] + 1 === xs.length) return I.ofRange(xs[0], xs[xs.length - 1]); + if (S.isRange(xs)) return I.ofRange(xs[0], xs[xs.length - 1]); return xs as any; } diff --git a/src/mol-data/int/impl/sorted-array.ts b/src/mol-data/int/impl/sorted-array.ts index fb5dfc950d353731d93dabb1f877afa8e1aeb019..38144716e7538d19399fe6d77351d18bbea9ada7 100644 --- a/src/mol-data/int/impl/sorted-array.ts +++ b/src/mol-data/int/impl/sorted-array.ts @@ -22,6 +22,7 @@ export function ofRange(min: number, max: number) { return ret; } export function is(xs: any): xs is Nums { return xs && (Array.isArray(xs) || !!xs.buffer); } +export function isRange(xs: Nums) { return xs[xs.length - 1] - xs[0] + 1 === xs.length; } export function start(xs: Nums) { return xs[0]; } export function end(xs: Nums) { return xs[xs.length - 1] + 1; } @@ -61,6 +62,7 @@ export function areEqual(a: Nums, b: Nums) { if (a === b) return true; const aSize = a.length; if (aSize !== b.length || a[0] !== b[0] || a[aSize - 1] !== b[aSize - 1]) return false; + if (isRange(a)) return true; for (let i = 0; i < aSize; i++) { if (a[i] !== b[i]) return false; } @@ -340,7 +342,7 @@ export function deduplicate(xs: Nums) { } export function indicesOf(a: Nums, b: Nums): Nums { - if (a === b) return ofSortedArray(createRangeArray(0, a.length - 1)); + if (areEqual(a, b)) return ofSortedArray(createRangeArray(0, a.length - 1)); const { startI: sI, startJ: sJ, endI, endJ } = getSuitableIntersectionRange(a, b); let i = sI, j = sJ; diff --git a/src/mol-data/int/sorted-array.ts b/src/mol-data/int/sorted-array.ts index d92f6066b02223e344a47829915f7b7d3c13654d..0d1b71197e62f0250942847adfcf3210d61dc6b5 100644 --- a/src/mol-data/int/sorted-array.ts +++ b/src/mol-data/int/sorted-array.ts @@ -17,6 +17,7 @@ namespace SortedArray { /** create sorted array [min, max) (it does NOT contain the max value) */ export const ofBounds: <T extends number = number>(min: T, max: T) => SortedArray<T> = (min, max) => Impl.ofRange(min, max - 1) as any; export const is: <T extends number = number>(v: any) => v is SortedArray<T> = Impl.is as any; + export const isRange: <T extends number = number>(array: ArrayLike<number>) => boolean = Impl.isRange as any; export const has: <T extends number = number>(array: SortedArray<T>, x: T) => boolean = Impl.has as any; /** Returns the index of `x` in `set` or -1 if not found. */