UNPKG

monaco-editor-core

Version:
112 lines 4.03 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { DebugLocation } from '../debugLocation.js'; import { getFunctionName } from '../debugName.js'; import { getLogger } from '../logging/logging.js'; let _derived; /** * @internal * This is to allow splitting files. */ export function _setDerivedOpts(derived) { _derived = derived; } let _recomputeInitiallyAndOnChange; export function _setRecomputeInitiallyAndOnChange(recomputeInitiallyAndOnChange) { _recomputeInitiallyAndOnChange = recomputeInitiallyAndOnChange; } let _keepObserved; export function _setKeepObserved(keepObserved) { _keepObserved = keepObserved; } let _debugGetDependencyGraph; export function _setDebugGetDependencyGraph(debugGetDependencyGraph) { _debugGetDependencyGraph = debugGetDependencyGraph; } export class ConvenientObservable { get TChange() { return null; } reportChanges() { this.get(); } /** @sealed */ read(reader) { if (reader) { return reader.readObservable(this); } else { return this.get(); } } map(fnOrOwner, fnOrUndefined, debugLocation = DebugLocation.ofCaller()) { const owner = fnOrUndefined === undefined ? undefined : fnOrOwner; const fn = fnOrUndefined === undefined ? fnOrOwner : fnOrUndefined; return _derived({ owner, debugName: () => { const name = getFunctionName(fn); if (name !== undefined) { return name; } // regexp to match `x => x.y` or `x => x?.y` where x and y can be arbitrary identifiers (uses backref): const regexp = /^\s*\(?\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\s*\)?\s*=>\s*\1(?:\??)\.([a-zA-Z_$][a-zA-Z_$0-9]*)\s*$/; const match = regexp.exec(fn.toString()); if (match) { return `${this.debugName}.${match[2]}`; } if (!owner) { return `${this.debugName} (mapped)`; } return undefined; }, debugReferenceFn: fn, }, (reader) => fn(this.read(reader), reader), debugLocation); } /** * @sealed * Converts an observable of an observable value into a direct observable of the value. */ flatten() { return _derived({ owner: undefined, debugName: () => `${this.debugName} (flattened)`, }, (reader) => this.read(reader).read(reader)); } recomputeInitiallyAndOnChange(store, handleValue) { store.add(_recomputeInitiallyAndOnChange(this, handleValue)); return this; } } export class BaseObservable extends ConvenientObservable { constructor(debugLocation) { super(); this._observers = new Set(); getLogger()?.handleObservableCreated(this, debugLocation); } addObserver(observer) { const len = this._observers.size; this._observers.add(observer); if (len === 0) { this.onFirstObserverAdded(); } if (len !== this._observers.size) { getLogger()?.handleOnListenerCountChanged(this, this._observers.size); } } removeObserver(observer) { const deleted = this._observers.delete(observer); if (deleted && this._observers.size === 0) { this.onLastObserverRemoved(); } if (deleted) { getLogger()?.handleOnListenerCountChanged(this, this._observers.size); } } onFirstObserverAdded() { } onLastObserverRemoved() { } debugGetObservers() { return this._observers; } } //# sourceMappingURL=baseObservable.js.map