1
1
import { useEffect , useState } from "react" ;
2
2
import { Push , Repeater , RepeaterBuffer , Stop } from "@repeaterjs/repeater" ;
3
3
4
- type PrimedRepeaterTuple < T > = [ Repeater < T > , Push < T > , Stop ] ;
5
4
// Repeaters are lazy, hooks are eager.
6
5
// We need to return push and stop synchronously from the useRepeater hook so
7
6
// we prime the repeater by calling next immediately.
8
7
function createPrimedRepeater < T > (
9
8
buffer ?: RepeaterBuffer < T > ,
10
- ) : PrimedRepeaterTuple < T > {
9
+ ) : [ Repeater < T > , Push < T > , Stop ] {
11
10
let push : Push < T > ;
12
11
let stop : Stop ;
13
12
const repeater = new Repeater ( ( push1 , stop1 ) => {
@@ -23,30 +22,29 @@ function createPrimedRepeater<T>(
23
22
24
23
export function useRepeater < T > (
25
24
buffer ?: RepeaterBuffer < T > ,
26
- ) : PrimedRepeaterTuple < T > {
27
- const [ tuple ] = useState ( ( ) => createPrimedRepeater ( buffer ) ) ;
28
- return tuple ;
25
+ ) : [ Repeater < T > , Push < T > , Stop ] {
26
+ const [ tuple ] = useState ( ( ) => createPrimedRepeater ( buffer ) ) ;
27
+ return tuple ;
29
28
}
30
29
31
30
export function useAsyncIter < T , TDeps extends any [ ] > (
32
31
callback : ( deps : AsyncIterableIterator < TDeps > ) => AsyncIterableIterator < T > ,
33
32
deps : TDeps = ( [ ] as unknown ) as TDeps ,
34
33
) : AsyncIterableIterator < T > {
35
- const [ repeater , push , stop ] = useRepeater < TDeps > ( ) ;
34
+ const [ repeater , push ] = useRepeater < TDeps > ( ) ;
36
35
const [ iter ] = useState ( ( ) => callback ( repeater ) ) ;
37
36
useEffect ( ( ) => {
38
37
push ( deps ) ;
39
38
} , [ push , ...deps ] ) ; // eslint-disable-line react-hooks/exhaustive-deps
40
39
41
40
useEffect (
42
41
( ) => ( ) => {
43
- stop ( ) ;
44
42
if ( iter . return != null ) {
45
43
// TODO: handle return errors
46
44
iter . return ( ) . catch ( ) ;
47
45
}
48
46
} ,
49
- [ iter , stop ] ,
47
+ [ iter ] ,
50
48
) ;
51
49
52
50
return iter ;
0 commit comments