From bfda62fd8131371b0d760d4cca8b0f06be700c30 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Fri, 18 Feb 2022 18:45:12 +0100 Subject: [PATCH] Introduces Cache helper class. --- .../audioCues/browser/audioCueService.ts | 58 +++++++++++-------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/src/vs/workbench/contrib/audioCues/browser/audioCueService.ts b/src/vs/workbench/contrib/audioCues/browser/audioCueService.ts index ccde40a5ab4..235d1a43b89 100644 --- a/src/vs/workbench/contrib/audioCues/browser/audioCueService.ts +++ b/src/vs/workbench/contrib/audioCues/browser/audioCueService.ts @@ -24,11 +24,6 @@ export interface IAudioCueService { export class AudioCueService extends Disposable implements IAudioCueService { readonly _serviceBrand: undefined; - private readonly audioCueEnabledObservables = new Map< - AudioCue, - IObservable - >(); - private readonly screenReaderAttached = fromEvent( this.accessibilityService.onDidChangeScreenReaderOptimized, () => this.accessibilityService.isScreenReaderOptimized() @@ -65,27 +60,42 @@ export class AudioCueService extends Disposable implements IAudioCueService { } } + private readonly isEnabledCache = new Cache((cue: AudioCue) => { + const settingObservable = fromEvent( + Event.filter(this.configurationService.onDidChangeConfiguration, (e) => + e.affectsConfiguration(cue.settingsKey) + ), + () => this.configurationService.getValue<'on' | 'off' | 'auto'>(cue.settingsKey) + ); + return new LazyDerived(reader => { + const setting = settingObservable.read(reader); + if (setting === 'auto') { + return this.screenReaderAttached.read(reader); + } else if (setting === 'on') { + return true; + } + return false; + }, 'audio cue enabled'); + }); + public isEnabled(cue: AudioCue): IObservable { - let observable = this.audioCueEnabledObservables.get(cue); - if (!observable) { - const settingObservable = fromEvent( - Event.filter(this.configurationService.onDidChangeConfiguration, (e) => - e.affectsConfiguration(cue.settingsKey) - ), - () => this.configurationService.getValue<'on' | 'off' | 'auto'>(cue.settingsKey) - ); - observable = new LazyDerived(reader => { - const setting = settingObservable.read(reader); - if (setting === 'auto') { - return this.screenReaderAttached.read(reader); - } else if (setting === 'on') { - return true; - } - return false; - }, 'audio cue enabled'); - this.audioCueEnabledObservables.set(cue, observable); + return this.isEnabledCache.get(cue); + } +} + +class Cache { + private readonly map = new Map(); + constructor(private readonly getValue: (value: TArg) => TValue) { + } + + public get(arg: TArg): TValue { + if (this.map.has(arg)) { + return this.map.get(arg)!; } - return observable; + + const value = this.getValue(arg); + this.map.set(arg, value); + return value; } }