1
1
import { useEffect } from 'react' ;
2
2
import { type IterationResult } from '../../useAsyncIter/index.js' ;
3
3
import { type AsyncIterableSubject } from '../../AsyncIterableSubject/index.js' ;
4
- import { type IterationResultSet } from '../../useAsyncIterMulti/index.js' ;
5
4
import { type Writable } from '../Writable.js' ;
6
5
import { useRefWithInitialValue } from '../hooks/useRefWithInitialValue.js' ;
7
6
import { isAsyncIter } from '../isAsyncIter.js' ;
@@ -12,28 +11,69 @@ import { iterateAsyncIterWithCallbacks } from '../iterateAsyncIterWithCallbacks.
12
11
13
12
export { useAsyncItersImperatively , type IterationResultSet } ;
14
13
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
+ } = <
18
58
const TInputs extends readonly unknown [ ] ,
19
59
const TInitVals extends readonly unknown [ ] = readonly [ ] ,
20
60
const TDefaultInitValue = undefined ,
21
61
> (
22
62
inputs : TInputs ,
23
- onYieldCb : ( vals : IterationResultSet < TInputs > ) => void ,
63
+ onYieldCb : ( vals : IterationResultSet < TInputs , TInitVals , TDefaultInitValue > ) => void ,
24
64
opts ?: {
25
65
initialValues ?: TInitVals ;
26
66
defaultInitialValue ?: TDefaultInitValue ;
27
67
}
28
- ) : IterationResultSet < TInputs > {
68
+ ) : IterationResultSet < TInputs , TInitVals , TDefaultInitValue > = > {
29
69
const optsNormed = {
30
70
initialValues : opts ?. initialValues ?? [ ] ,
31
71
defaultInitialValue : opts ?. defaultInitialValue ,
32
72
} ;
33
73
34
74
const ref = useRefWithInitialValue ( ( ) => ( {
35
75
currDiffCompId : 0 ,
36
- currResults : [ ] as IterationResultSet < TInputs > ,
76
+ currResults : [ ] as IterationResultSet < TInputs , TInitVals , TDefaultInitValue > ,
37
77
activeItersMap : new Map <
38
78
AsyncIterable < unknown > ,
39
79
{
@@ -130,7 +170,7 @@ function useAsyncItersImperatively<
130
170
activeItersMap . set ( baseIter , iterState ) ;
131
171
132
172
return iterState . currState ;
133
- } ) as Writable < IterationResultSet < TInputs > > ;
173
+ } ) as Writable < IterationResultSet < TInputs , TInitVals , TDefaultInitValue > > ;
134
174
135
175
// 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
136
176
const numOfPrevRunItersDisappeared = numOfPrevRunIters - numOfPrevRunItersPreserved ;
@@ -149,4 +189,15 @@ function useAsyncItersImperatively<
149
189
}
150
190
151
191
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