11import { useEffect } from 'react' ;
22import { type IterationResult } from '../../useAsyncIter/index.js' ;
33import { type AsyncIterableSubject } from '../../AsyncIterableSubject/index.js' ;
4- import { type IterationResultSet } from '../../useAsyncIterMulti/index.js' ;
54import { type Writable } from '../Writable.js' ;
65import { useRefWithInitialValue } from '../hooks/useRefWithInitialValue.js' ;
76import { isAsyncIter } from '../isAsyncIter.js' ;
@@ -12,28 +11,69 @@ import { iterateAsyncIterWithCallbacks } from '../iterateAsyncIterWithCallbacks.
1211
1312export { 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+ } ;
0 commit comments