Skip to content

Commit

Permalink
fix: Fixed typings and arguments of mergeQueries()
Browse files Browse the repository at this point in the history
  • Loading branch information
mnasyrov committed Sep 2, 2021
1 parent c8a5137 commit 156abcc
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 12 deletions.
2 changes: 1 addition & 1 deletion packages/rx-effects/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ Utility functions:
const store2 = createStore<number>(3);
const sumValueQuery = mergeQueries(
[store1, store2],
([value1, value2]) => value1 + value2,
(value1, value2) => value1 + value2,
);
```

Expand Down
16 changes: 14 additions & 2 deletions packages/rx-effects/src/stateQuery.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ describe('mergeQueries()', () => {
it('should return a calculated value from source queries', () => {
const store1 = createStore(2);
const store2 = createStore('text');
const query = mergeQueries([store1, store2], ([a, b]) => ({ a, b }));
const query = mergeQueries([store1, store2], (a, b) => ({ a, b }));

expect(query.get()).toEqual({ a: 2, b: 'text' });

Expand All @@ -40,7 +40,7 @@ describe('mergeQueries()', () => {
it('should return an observable with the calculated value from source queries', async () => {
const store1 = createStore(2);
const store2 = createStore('text');
const query = mergeQueries([store1, store2], ([a, b]) => ({ a, b }));
const query = mergeQueries([store1, store2], (a, b) => ({ a, b }));

expect(await firstValueFrom(query.value$)).toEqual({ a: 2, b: 'text' });

Expand All @@ -50,4 +50,16 @@ describe('mergeQueries()', () => {
store2.set('text2');
expect(await firstValueFrom(query.value$)).toEqual({ a: 3, b: 'text2' });
});

it('should infer types for values of the queries', () => {
const store1 = createStore<number>(2);
const store2 = createStore<{ value: number }>({ value: 3 });

const query: StateQuery<number> = mergeQueries(
[store1, store2],
(value, obj) => value + obj.value,
);

expect(query.get()).toEqual(5);
});
});
19 changes: 10 additions & 9 deletions packages/rx-effects/src/stateQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,20 @@ export function mapQuery<T, R>(
* @param queries source queries
* @param merger value merger
*/
export function mergeQueries<
Queries extends StateQuery<unknown>[],
Values extends {
[K in keyof Queries]: Queries[K] extends StateQuery<infer V> ? V : never;
},
Result,
>(queries: Queries, merger: (values: Values) => Result): StateQuery<Result> {
export function mergeQueries<Values extends unknown[], Result>(
queries: [
...{
[K in keyof Values]: StateQuery<Values[K]>;
}
],
merger: (...values: Values) => Result,
): StateQuery<Result> {
const value$ = combineLatest(queries.map((query) => query.value$)).pipe(
map((values) => merger(values as Values)),
map((values) => merger(...(values as Values))),
);

return {
get: () => merger(queries.map((query) => query.get()) as Values),
get: () => merger(...(queries.map((query) => query.get()) as Values)),
value$,
};
}

0 comments on commit 156abcc

Please sign in to comment.