diff --git a/src/mol-data/int/_spec/ordered-set.spec.ts b/src/mol-data/int/_spec/ordered-set.spec.ts index 37d5ae0d42676d864434d5af6b7e0f91003e93fc..8cbad68ceb07cdb09f51398ebf61274f53b14cfc 100644 --- a/src/mol-data/int/_spec/ordered-set.spec.ts +++ b/src/mol-data/int/_spec/ordered-set.spec.ts @@ -157,4 +157,10 @@ describe('ordered set', () => { testEq('subtract AA', OrderedSet.subtract(arr136, arr136), []); testEq('subtract AA1', OrderedSet.subtract(arr136, OrderedSet.ofSortedArray([2, 3, 4, 6, 7])), [1]); testEq('subtract AA2', OrderedSet.subtract(arr136, OrderedSet.ofSortedArray([0, 1, 6])), [3]); + + it('foreach', () => { + const int = OrderedSet.ofBounds(1, 3), set = OrderedSet.ofSortedArray([2, 3, 4]); + expect(OrderedSet.forEach(int, (v, i, ctx) => ctx[i] = v, [] as number[])).toEqual([1, 2]); + expect(OrderedSet.forEach(set, (v, i, ctx) => ctx[i] = v, [] as number[])).toEqual([2, 3, 4]); + }) }); \ No newline at end of file diff --git a/src/mol-data/int/impl/ordered-set.ts b/src/mol-data/int/impl/ordered-set.ts index 5c48cb5b8407a2841a505477667c8a12852a6a5a..5688286a7f5937e159cd0bb689789255e1814e90 100644 --- a/src/mol-data/int/impl/ordered-set.ts +++ b/src/mol-data/int/impl/ordered-set.ts @@ -253,4 +253,18 @@ function subtractIS(a: I, b: S) { } for (let i = last + 1; i <= max; i++) ret[offset++] = i; return ofSortedArray(ret); +} + +export function forEach(set: OrderedSetImpl, f: (value: number, i: number, ctx: any) => void, ctx: any) { + if (I.is(set)) { + const start = I.min(set); + for (let i = start, _i = I.max(set); i <= _i; i++) { + f(i, i - start, ctx); + } + } else { + for (let i = 0, _i = set.length; i < _i; i++) { + f(set[i], i, ctx); + } + } + return ctx; } \ No newline at end of file diff --git a/src/mol-data/int/ordered-set.ts b/src/mol-data/int/ordered-set.ts index 2520643108bf28deb22e2bdc26852b17a37f91d4..54776e79d0fe3e49aeb6582160b56ece8b447cd8 100644 --- a/src/mol-data/int/ordered-set.ts +++ b/src/mol-data/int/ordered-set.ts @@ -35,6 +35,10 @@ namespace OrderedSet { export const findPredecessorIndex: (set: OrderedSet, x: number) => number = Base.findPredecessorIndex as any; export const findPredecessorIndexInInterval: (set: OrderedSet, x: number, range: Interval) => number = Base.findPredecessorIndexInInterval as any; export const findRange: (set: OrderedSet, min: number, max: number) => Interval = Base.findRange as any; + + export function forEach<Ctx>(set: OrderedSet, f: (v: number, i: number, ctx: Ctx) => void, ctx?: Ctx): Ctx { + return Base.forEach(set as any, f, ctx); + } } interface OrderedSet { '@type': 'int-interval' | 'int-sorted-array' } diff --git a/src/mol-model/structure/model/formats/mmcif.ts b/src/mol-model/structure/model/formats/mmcif.ts index 36ac1b0111a3a0a2a5f080a1e049817f369a2d7f..31f3abb45f21f4fd37ddbf502b7d6fbbd27fd761 100644 --- a/src/mol-model/structure/model/formats/mmcif.ts +++ b/src/mol-model/structure/model/formats/mmcif.ts @@ -7,7 +7,7 @@ import { Column, Table } from 'mol-data/db'; import { Interval, Segmentation } from 'mol-data/int'; import { Spacegroup, SpacegroupCell, SymmetryOperator } from 'mol-math/geometry'; -import { Vec3, Tensor, Mat4 } from 'mol-math/linear-algebra'; +import { Vec3, Tensor } from 'mol-math/linear-algebra'; import { Task } from 'mol-task'; import UUID from 'mol-util/uuid'; import Format from '../format'; diff --git a/src/mol-model/structure/model/types.ts b/src/mol-model/structure/model/types.ts index 16c748b99b1d3d38f4a88614837ae8658acaed94..a9b7483bf4d86b96b74c1d0a4bde09931fb2f3ba 100644 --- a/src/mol-model/structure/model/types.ts +++ b/src/mol-model/structure/model/types.ts @@ -25,7 +25,7 @@ const _esCache = (function () { } return cache; }()); -export interface ElementSymbol extends String { '@type': 'element-symbol' } +export type ElementSymbol = string & { '@type': 'element-symbol' } export function ElementSymbol(s: string): ElementSymbol { return _esCache[s] || s.toUpperCase(); }