Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/editTelemetry/browser/helpers/utils.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { AsyncIterableProducer } from '../../../../../base/common/async.js';
7
import { DisposableStore, toDisposable } from '../../../../../base/common/lifecycle.js';
8
import { IObservableWithChange, observableValue, runOnChange, transaction, RemoveUndefined } from '../../../../../base/common/observable.js';
9
10
export function sumByCategory<T, TCategory extends string>(items: readonly T[], getValue: (item: T) => number, getCategory: (item: T) => TCategory): Record<TCategory, number | undefined> {
11
return items.reduce((acc, item) => {
12
const category = getCategory(item);
13
acc[category] = (acc[category] || 0) + getValue(item);
14
return acc;
15
}, {} as any as Record<TCategory, number>);
16
}
17
18
export function mapObservableDelta<T, TDelta, TDeltaNew>(obs: IObservableWithChange<T, TDelta>, mapFn: (value: TDelta) => TDeltaNew, store: DisposableStore): IObservableWithChange<T, TDeltaNew> {
19
const obsResult = observableValue<T, TDeltaNew>('mapped', obs.get());
20
store.add(runOnChange(obs, (value, _prevValue, changes) => {
21
transaction(tx => {
22
for (const c of changes) {
23
obsResult.set(value, tx, mapFn(c));
24
}
25
});
26
}));
27
return obsResult;
28
}
29
30
export function iterateObservableChanges<T, TChange>(obs: IObservableWithChange<T, TChange>, store: DisposableStore): AsyncIterable<{ value: T; prevValue: T; change: RemoveUndefined<TChange>[] }> {
31
return new AsyncIterableProducer<{ value: T; prevValue: T; change: RemoveUndefined<TChange>[] }>((e) => {
32
store.add(runOnChange(obs, (value, prevValue, change) => {
33
e.emitOne({ value, prevValue, change: change });
34
}));
35
36
return new Promise((res) => {
37
store.add(toDisposable(() => {
38
res(undefined);
39
}));
40
});
41
});
42
}
43
44