Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6a92373

Browse files
authored
refactor: internal refactoring for useAsyncIterMulti and useAsyncItersImperatively (#101)
1 parent 9b4dd52 commit 6a92373

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 ?? [])asTInitValues,
211+
defaultInitialValue: opts?.defaultInitialValueasTDefaultInitValue,
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)

AltStyle によって変換されたページ (->オリジナル) /