UNPKG

@itwin/unified-selection

Version:

Package for managing unified selection in iTwin.js applications.

68 lines 3.11 kB
"use strict"; /*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); exports.createCachingHiliteSetProvider = createCachingHiliteSetProvider; require("./DisposePolyfill.js"); const rxjs_1 = require("rxjs"); const rxjs_for_await_1 = require("rxjs-for-await"); const HiliteSetProvider_js_1 = require("./HiliteSetProvider.js"); const SelectionStorage_js_1 = require("./SelectionStorage.js"); /** * Creates a hilite set provider that caches hilite set for current selection for given iModel so any subsequent * hilite set requests for the same iModel don't cost until selection in given selection storage changes. * @public */ function createCachingHiliteSetProvider(props) { return new CachingHiliteSetProviderImpl(props); } class CachingHiliteSetProviderImpl { _selectionStorage; _hiliteSetProviders = new Map(); _cache = new Map(); _removeListener; _imodelProvider; _createHiliteSetProvider; constructor(props) { this._selectionStorage = props.selectionStorage; this._imodelProvider = props.imodelProvider; this._removeListener = this._selectionStorage.selectionChangeEvent.addListener((args) => { this._cache.delete(args.imodelKey); if (args.changeType === "clear" && args.source === SelectionStorage_js_1.IMODEL_CLOSE_SELECTION_CLEAR_SOURCE) { this._hiliteSetProviders.delete(args.imodelKey); } }); this._createHiliteSetProvider = props.createHiliteSetProvider ?? /* c8 ignore next */ HiliteSetProvider_js_1.createHiliteSetProvider; } getHiliteSet({ imodelKey }) { const imodelAccess = this._imodelProvider(imodelKey); const provider = this.getHiliteSetProvider(imodelKey, imodelAccess); let hiliteSet = this._cache.get(imodelKey); if (!hiliteSet) { const selectables = this._selectionStorage.getSelection({ imodelKey }); hiliteSet = (0, rxjs_1.from)(provider.getHiliteSet({ selectables })).pipe((0, rxjs_1.shareReplay)({ refCount: true })); this._cache.set(imodelKey, hiliteSet); } return (0, rxjs_for_await_1.eachValueFrom)(hiliteSet); } [Symbol.dispose]() { this._removeListener(); this._hiliteSetProviders = new Map(); this._cache = new Map(); } /* c8 ignore next 3 */ dispose() { this[Symbol.dispose](); } getHiliteSetProvider(imodelKey, imodelAccess) { let provider = this._hiliteSetProviders.get(imodelKey); if (!provider) { provider = this._createHiliteSetProvider({ imodelAccess }); this._hiliteSetProviders.set(imodelKey, provider); } return provider; } } //# sourceMappingURL=CachingHiliteSetProvider.js.map