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
5245 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
// eslint-disable-next-line local/code-no-any-casts
16
}, {} as any as Record<TCategory, number>);
17
}
18
19
export function mapObservableDelta<T, TDelta, TDeltaNew>(obs: IObservableWithChange<T, TDelta>, mapFn: (value: TDelta) => TDeltaNew, store: DisposableStore): IObservableWithChange<T, TDeltaNew> {
20
const obsResult = observableValue<T, TDeltaNew>('mapped', obs.get());
21
store.add(runOnChange(obs, (value, _prevValue, changes) => {
22
transaction(tx => {
23
for (const c of changes) {
24
obsResult.set(value, tx, mapFn(c));
25
}
26
});
27
}));
28
return obsResult;
29
}
30
31
export function iterateObservableChanges<T, TChange>(obs: IObservableWithChange<T, TChange>, store: DisposableStore): AsyncIterable<{ value: T; prevValue: T; change: RemoveUndefined<TChange>[] }> {
32
return new AsyncIterableProducer<{ value: T; prevValue: T; change: RemoveUndefined<TChange>[] }>((e) => {
33
if (store.isDisposed) {
34
return;
35
}
36
store.add(runOnChange(obs, (value, prevValue, change) => {
37
e.emitOne({ value, prevValue, change: change });
38
}));
39
40
return new Promise((res) => {
41
store.add(toDisposable(() => {
42
res(undefined);
43
}));
44
});
45
});
46
}
47
48