Path: blob/main/src/vs/workbench/contrib/editTelemetry/browser/helpers/utils.ts
5245 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { AsyncIterableProducer } from '../../../../../base/common/async.js';6import { DisposableStore, toDisposable } from '../../../../../base/common/lifecycle.js';7import { IObservableWithChange, observableValue, runOnChange, transaction, RemoveUndefined } from '../../../../../base/common/observable.js';89export function sumByCategory<T, TCategory extends string>(items: readonly T[], getValue: (item: T) => number, getCategory: (item: T) => TCategory): Record<TCategory, number | undefined> {10return items.reduce((acc, item) => {11const category = getCategory(item);12acc[category] = (acc[category] || 0) + getValue(item);13return acc;14// eslint-disable-next-line local/code-no-any-casts15}, {} as any as Record<TCategory, number>);16}1718export function mapObservableDelta<T, TDelta, TDeltaNew>(obs: IObservableWithChange<T, TDelta>, mapFn: (value: TDelta) => TDeltaNew, store: DisposableStore): IObservableWithChange<T, TDeltaNew> {19const obsResult = observableValue<T, TDeltaNew>('mapped', obs.get());20store.add(runOnChange(obs, (value, _prevValue, changes) => {21transaction(tx => {22for (const c of changes) {23obsResult.set(value, tx, mapFn(c));24}25});26}));27return obsResult;28}2930export function iterateObservableChanges<T, TChange>(obs: IObservableWithChange<T, TChange>, store: DisposableStore): AsyncIterable<{ value: T; prevValue: T; change: RemoveUndefined<TChange>[] }> {31return new AsyncIterableProducer<{ value: T; prevValue: T; change: RemoveUndefined<TChange>[] }>((e) => {32if (store.isDisposed) {33return;34}35store.add(runOnChange(obs, (value, prevValue, change) => {36e.emitOne({ value, prevValue, change: change });37}));3839return new Promise((res) => {40store.add(toDisposable(() => {41res(undefined);42}));43});44});45}464748