Skip to content

Commit d217e46

Browse files
committed
internal refactor for useAsyncIterMulti nad useAsyncItersImperatively
1 parent 9b4dd52 commit d217e46

File tree

2 files changed

+68
-36
lines changed

2 files changed

+68
-36
lines changed

src/common/useAsyncItersImperatively/index.ts

Lines changed: 60 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { useEffect } from 'react';
22
import { type IterationResult } from '../../useAsyncIter/index.js';
33
import { type AsyncIterableSubject } from '../../AsyncIterableSubject/index.js';
4-
import { type IterationResultSet } from '../../useAsyncIterMulti/index.js';
54
import { type Writable } from '../Writable.js';
65
import { useRefWithInitialValue } from '../hooks/useRefWithInitialValue.js';
76
import { isAsyncIter } from '../isAsyncIter.js';
@@ -12,28 +11,69 @@ import { iterateAsyncIterWithCallbacks } from '../iterateAsyncIterWithCallbacks.
1211

1312
export { useAsyncItersImperatively, type IterationResultSet };
1413

15-
// TODO: Move the `IterationResultSet` type's home to sit together with this function here instead next to `useAsyncIterMulti` as currently
16-
17-
function useAsyncItersImperatively<
14+
const useAsyncItersImperatively: {
15+
<const TInputs extends readonly unknown[]>(
16+
inputs: TInputs,
17+
onYieldCb: (vals: IterationResultSet<TInputs>) => void,
18+
opts?: {
19+
initialValues?: undefined;
20+
defaultInitialValue?: undefined;
21+
}
22+
): IterationResultSet<TInputs>;
23+
24+
<
25+
const TInputs extends readonly unknown[],
26+
const TInitVals extends readonly unknown[] = readonly [],
27+
>(
28+
inputs: TInputs,
29+
onYieldCb: (vals: IterationResultSet<TInputs>) => void,
30+
opts: {
31+
initialValues: TInitVals;
32+
defaultInitialValue?: undefined;
33+
}
34+
): IterationResultSet<TInputs, TInitVals>;
35+
36+
<const TInputs extends readonly unknown[], const TDefaultInitValue = undefined>(
37+
inputs: TInputs,
38+
onYieldCb: (vals: IterationResultSet<TInputs>) => void,
39+
opts: {
40+
initialValues?: undefined;
41+
defaultInitialValue: TDefaultInitValue;
42+
}
43+
): IterationResultSet<TInputs, [], TDefaultInitValue>;
44+
45+
<
46+
const TInputs extends readonly unknown[],
47+
const TInitVals extends readonly unknown[] = readonly [],
48+
const TDefaultInitValue = undefined,
49+
>(
50+
inputs: TInputs,
51+
onYieldCb: (vals: IterationResultSet<TInputs>) => void,
52+
opts: {
53+
initialValues: TInitVals;
54+
defaultInitialValue: TDefaultInitValue;
55+
}
56+
): IterationResultSet<TInputs, TInitVals, TDefaultInitValue>;
57+
} = <
1858
const TInputs extends readonly unknown[],
1959
const TInitVals extends readonly unknown[] = readonly [],
2060
const TDefaultInitValue = undefined,
2161
>(
2262
inputs: TInputs,
23-
onYieldCb: (vals: IterationResultSet<TInputs>) => void,
63+
onYieldCb: (vals: IterationResultSet<TInputs, TInitVals, TDefaultInitValue>) => void,
2464
opts?: {
2565
initialValues?: TInitVals;
2666
defaultInitialValue?: TDefaultInitValue;
2767
}
28-
): IterationResultSet<TInputs> {
68+
): IterationResultSet<TInputs, TInitVals, TDefaultInitValue> => {
2969
const optsNormed = {
3070
initialValues: opts?.initialValues ?? [],
3171
defaultInitialValue: opts?.defaultInitialValue,
3272
};
3373

3474
const ref = useRefWithInitialValue(() => ({
3575
currDiffCompId: 0,
36-
currResults: [] as IterationResultSet<TInputs>,
76+
currResults: [] as IterationResultSet<TInputs, TInitVals, TDefaultInitValue>,
3777
activeItersMap: new Map<
3878
AsyncIterable<unknown>,
3979
{
@@ -130,7 +170,7 @@ function useAsyncItersImperatively<
130170
activeItersMap.set(baseIter, iterState);
131171

132172
return iterState.currState;
133-
}) as Writable<IterationResultSet<TInputs>>;
173+
}) as Writable<IterationResultSet<TInputs, TInitVals, TDefaultInitValue>>;
134174

135175
// TODO: If the consumers of `useAsyncItersImperatively` within the library are intending to use it in conjunction with `React.useEffect` (e.g. `useAsyncIterEffect`) - do we really need to do such individual length comparisons and cleanups like the following? `React.useEffect` enforces strict static-length deps anyways
136176
const numOfPrevRunItersDisappeared = numOfPrevRunIters - numOfPrevRunItersPreserved;
@@ -149,4 +189,15 @@ function useAsyncItersImperatively<
149189
}
150190

151191
return ref.current.currResults;
152-
}
192+
};
193+
194+
type IterationResultSet<
195+
TValues extends readonly unknown[],
196+
TInitValues extends readonly unknown[] = readonly [],
197+
TDefaultInitValue = undefined,
198+
> = {
199+
[I in keyof TValues]: IterationResult<
200+
TValues[I],
201+
I extends keyof TInitValues ? TInitValues[I] : TDefaultInitValue
202+
>;
203+
};

src/useAsyncIterMulti/index.ts

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { useSimpleRerender } from '../common/hooks/useSimpleRerender.js';
22
import { type IterationResult } from '../useAsyncIter/index.js';
3-
import { type MaybeFunction } from '../common/MaybeFunction.js';
4-
import { useAsyncItersImperatively } from '../common/useAsyncItersImperatively/index.js';
3+
import {
4+
useAsyncItersImperatively,
5+
type IterationResultSet,
6+
} from '../common/useAsyncItersImperatively/index.js';
57

68
export { useAsyncIterMulti, type IterationResult, type IterationResultSet };
79

@@ -201,34 +203,13 @@ function useAsyncIterMulti<
201203
initialValues?: TInitValues;
202204
defaultInitialValue?: TDefaultInitValue;
203205
}
204-
): IterationResultSet<TValues, MaybeFunctions<TInitValues>, TDefaultInitValue> {
206+
): IterationResultSet<TValues, TInitValues, TDefaultInitValue> {
205207
const update = useSimpleRerender();
206208

207209
const currValues = useAsyncItersImperatively(inputs, () => update(), {
208-
initialValues: opts?.initialValues ?? [],
209-
defaultInitialValue: opts?.defaultInitialValue,
210+
initialValues: (opts?.initialValues ?? []) as TInitValues,
211+
defaultInitialValue: opts?.defaultInitialValue as TDefaultInitValue,
210212
});
211213

212-
const currValuesTypePatched = currValues as IterationResultSet<
213-
TValues,
214-
MaybeFunctions<TInitValues>,
215-
TDefaultInitValue
216-
>;
217-
218-
return currValuesTypePatched;
214+
return currValues;
219215
}
220-
221-
type IterationResultSet<
222-
TValues extends readonly unknown[],
223-
TInitValues extends readonly unknown[] = readonly [],
224-
TDefaultInitValue = undefined,
225-
> = {
226-
[I in keyof TValues]: IterationResult<
227-
TValues[I],
228-
I extends keyof TInitValues ? TInitValues[I] : TDefaultInitValue
229-
>;
230-
};
231-
232-
type MaybeFunctions<T extends readonly unknown[]> = {
233-
[I in keyof T]: T[I] extends MaybeFunction<infer J> ? J : T[I];
234-
};

0 commit comments

Comments
 (0)