UNPKG

monaco-editor

Version:
90 lines (87 loc) 3.75 kB
import '../../equals.js'; import '../../event.js'; import { DisposableStore, toDisposable } from '../../lifecycle.js'; import { DebugNameData } from '../debugName.js'; import { AutorunObserver } from './autorunImpl.js'; import { DebugLocation } from '../debugLocation.js'; /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ /** * Runs immediately and whenever a transaction ends and an observed observable changed. * {@link fn} should start with a JS Doc using `@description` to name the autorun. */ function autorun(fn, debugLocation = DebugLocation.ofCaller()) { return new AutorunObserver(new DebugNameData(undefined, undefined, fn), fn, undefined, debugLocation); } /** * Runs immediately and whenever a transaction ends and an observed observable changed. * {@link fn} should start with a JS Doc using `@description` to name the autorun. */ function autorunOpts(options, fn, debugLocation = DebugLocation.ofCaller()) { return new AutorunObserver(new DebugNameData(options.owner, options.debugName, options.debugReferenceFn ?? fn), fn, undefined, debugLocation); } /** * Runs immediately and whenever a transaction ends and an observed observable changed. * {@link fn} should start with a JS Doc using `@description` to name the autorun. * * Use `changeTracker.createChangeSummary` to create a "change summary" that can collect the changes. * Use `changeTracker.handleChange` to add a reported change to the change summary. * The run function is given the last change summary. * The change summary is discarded after the run function was called. * * @see autorun */ function autorunHandleChanges(options, fn, debugLocation = DebugLocation.ofCaller()) { return new AutorunObserver(new DebugNameData(options.owner, options.debugName, options.debugReferenceFn ?? fn), fn, options.changeTracker, debugLocation); } /** * @see autorunHandleChanges (but with a disposable store that is cleared before the next run or on dispose) */ function autorunWithStoreHandleChanges(options, fn) { const store = new DisposableStore(); const disposable = autorunHandleChanges({ owner: options.owner, debugName: options.debugName, debugReferenceFn: options.debugReferenceFn ?? fn, changeTracker: options.changeTracker, }, (reader, changeSummary) => { store.clear(); fn(reader, changeSummary, store); }); return toDisposable(() => { disposable.dispose(); store.dispose(); }); } /** * @see autorun (but with a disposable store that is cleared before the next run or on dispose) * * @deprecated Use `autorun(reader => { reader.store.add(...) })` instead! */ function autorunWithStore(fn) { const store = new DisposableStore(); const disposable = autorunOpts({ owner: undefined, debugName: undefined, debugReferenceFn: fn, }, reader => { store.clear(); fn(reader, store); }); return toDisposable(() => { disposable.dispose(); store.dispose(); }); } function autorunDelta(observable, handler) { let _lastValue; return autorunOpts({ debugReferenceFn: handler }, (reader) => { const newValue = observable.read(reader); const lastValue = _lastValue; _lastValue = newValue; handler({ lastValue, newValue }); }); } export { autorun, autorunDelta, autorunHandleChanges, autorunOpts, autorunWithStore, autorunWithStoreHandleChanges };