From fa5d125113c82e16492585470f19792d429d8fd6 Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Fri, 15 Jun 2018 13:55:25 +0200 Subject: [PATCH] OrderedSet.forEach --- src/mol-data/int/_spec/ordered-set.spec.ts | 6 ++++++ src/mol-data/int/impl/ordered-set.ts | 14 ++++++++++++++ src/mol-data/int/ordered-set.ts | 4 ++++ src/mol-model/structure/model/formats/mmcif.ts | 2 +- src/mol-model/structure/model/types.ts | 2 +- 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/mol-data/int/_spec/ordered-set.spec.ts b/src/mol-data/int/_spec/ordered-set.spec.ts index 37d5ae0d4..8cbad68ce 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 5c48cb5b8..5688286a7 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 252064310..54776e79d 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 36ac1b011..31f3abb45 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 16c748b99..a9b7483bf 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(); } -- GitLab