Path: blob/main/src/vs/workbench/contrib/editTelemetry/browser/helpers/utils.ts
3296 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}, {} as any as Record<TCategory, number>);15}1617export function mapObservableDelta<T, TDelta, TDeltaNew>(obs: IObservableWithChange<T, TDelta>, mapFn: (value: TDelta) => TDeltaNew, store: DisposableStore): IObservableWithChange<T, TDeltaNew> {18const obsResult = observableValue<T, TDeltaNew>('mapped', obs.get());19store.add(runOnChange(obs, (value, _prevValue, changes) => {20transaction(tx => {21for (const c of changes) {22obsResult.set(value, tx, mapFn(c));23}24});25}));26return obsResult;27}2829export function iterateObservableChanges<T, TChange>(obs: IObservableWithChange<T, TChange>, store: DisposableStore): AsyncIterable<{ value: T; prevValue: T; change: RemoveUndefined<TChange>[] }> {30return new AsyncIterableProducer<{ value: T; prevValue: T; change: RemoveUndefined<TChange>[] }>((e) => {31store.add(runOnChange(obs, (value, prevValue, change) => {32e.emitOne({ value, prevValue, change: change });33}));3435return new Promise((res) => {36store.add(toDisposable(() => {37res(undefined);38}));39});40});41}424344