diff --git a/src/vs/base/common/observableImpl/autorun.ts b/src/vs/base/common/observableImpl/autorun.ts index 263ac803a4f..04eff332e5f 100644 --- a/src/vs/base/common/observableImpl/autorun.ts +++ b/src/vs/base/common/observableImpl/autorun.ts @@ -23,6 +23,41 @@ export function autorunHandleChanges( return new AutorunObserver(debugName, fn, options.createEmptyChangeSummary, options.handleChange); } +// TODO@hediet rename to autorunWithStore +export function autorunWithStore2( + debugName: string, + fn: (reader: IReader, store: DisposableStore) => void, +): IDisposable { + return autorunWithStore(fn, debugName); +} + +export function autorunWithStoreHandleChanges( + debugName: string, + options: { + createEmptyChangeSummary?: () => TChangeSummary; + handleChange: (context: IChangeContext, changeSummary: TChangeSummary) => boolean; + }, + fn: (reader: IReader, changeSummary: TChangeSummary, store: DisposableStore) => void +): IDisposable { + const store = new DisposableStore(); + const disposable = autorunHandleChanges( + debugName, + { + createEmptyChangeSummary: options.createEmptyChangeSummary, + handleChange: options.handleChange, + }, + (reader, changeSummary) => { + store.clear(); + fn(reader, changeSummary, store); + } + ); + return toDisposable(() => { + disposable.dispose(); + store.dispose(); + }); +} + +// TODO@hediet deprecate, rename to autorunWithStoreEx export function autorunWithStore( fn: (reader: IReader, store: DisposableStore) => void, debugName: string diff --git a/src/vs/base/common/observableImpl/base.ts b/src/vs/base/common/observableImpl/base.ts index 7fc48ddf273..61addad7411 100644 --- a/src/vs/base/common/observableImpl/base.ts +++ b/src/vs/base/common/observableImpl/base.ts @@ -7,6 +7,11 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import type { derived } from 'vs/base/common/observableImpl/derived'; import { getLogger } from 'vs/base/common/observableImpl/logging'; +/** + * Represents an observable value. + * @template T The type of the value. + * @template TChange The type of delta information (usually `void` and only used in advanced scenarios). + */ export interface IObservable { /** * Returns the current value. @@ -248,6 +253,10 @@ export function getFunctionName(fn: Function): string | undefined { export interface ISettableObservable extends IObservable, ISettable { } +/** + * Creates an observable value. + * Observers get informed when the value changes. + */ export function observableValue(name: string, initialValue: T): ISettableObservable { return new ObservableValue(name, initialValue); } diff --git a/src/vs/base/common/observableImpl/utils.ts b/src/vs/base/common/observableImpl/utils.ts index 093f78773ec..9d13c29ade6 100644 --- a/src/vs/base/common/observableImpl/utils.ts +++ b/src/vs/base/common/observableImpl/utils.ts @@ -198,6 +198,9 @@ class FromEventObservableSignal extends BaseObservable { } } +/** + * Creates a signal that can be triggered to invalidate observers. + */ export function observableSignal( debugName: string ): IObservableSignal { @@ -287,6 +290,10 @@ export function wasEventTriggeredRecently(event: Event, timeoutMs: number, export function keepAlive(observable: IObservable, forceRecompute?: boolean): IDisposable { const o = new KeepAliveObserver(forceRecompute ?? false); observable.addObserver(o); + if (forceRecompute) { + observable.reportChanges(); + } + return toDisposable(() => { observable.removeObserver(o); });