@@ -7,11 +7,11 @@ import type { ResultBag } from "effect-react/hooks/useResultBag"
7
7
import { updateNext , useResultBag } from "effect-react/hooks/useResultBag"
8
8
import type { RuntimeContext } from "effect-react/internal/runtimeContext"
9
9
import * as Result from "effect-react/Result"
10
- import { useCallback , useContext , useRef , useState } from "react"
10
+ import { useCallback , useContext , useEffect , useRef , useState } from "react"
11
11
12
12
export type UseResultCallback < R > = < Args extends Array < any > , R0 extends R , E , A > (
13
13
callback : ( ...args : Args ) => Effect . Effect < R0 , E , A >
14
- ) => readonly [ ResultBag < E , A > , ( ...args : Args ) => void , Queue . Queue < Args > ]
14
+ ) => readonly [ ResultBag < E , A > , ( ...args : Args ) => void ]
15
15
16
16
export const makeUseResultCallback : < R > (
17
17
runtimeContext : RuntimeContext < R >
@@ -21,26 +21,21 @@ export const makeUseResultCallback: <R>(
21
21
< Args extends Array < any > , R0 extends R , E , A > ( f : ( ...args : Args ) => Stream . Stream < R0 , E , A > ) => {
22
22
const runtime = useContext ( runtimeContext )
23
23
const fiberRef = useRef < Fiber . RuntimeFiber < E , void > > ( )
24
- const prevRef = useRef < typeof f > ( )
25
- const queueRef = useRef < Queue . Queue < Args > > ( )
24
+ const queueRef = useRef < Queue . Queue < [ ( ...args : Args ) => Stream . Stream < R0 , E , A > , Args ] > > ( )
26
25
if ( ! queueRef . current ) {
27
26
queueRef . current = Effect . runSync ( Queue . unbounded ( ) )
28
27
}
29
28
const [ result , setResult ] = useState < Result . Result < E , A > > ( Result . initial ( ) )
30
29
const [ trackRef , resultBag ] = useResultBag ( result )
31
30
32
- if ( prevRef . current !== f ) {
33
- prevRef . current = f
34
- if ( fiberRef . current ) {
35
- Effect . runSync ( Fiber . interruptFork ( fiberRef . current ) )
36
- }
31
+ if ( ! fiberRef . current ) {
37
32
fiberRef . current = Stream . fromQueue ( queueRef . current ) . pipe (
38
33
Stream . tap ( ( ) =>
39
34
Effect . sync ( ( ) => {
40
35
setResult ( ( prev ) => updateNext ( Result . waiting ( prev ) , trackRef ) )
41
36
} )
42
37
) ,
43
- Stream . flatMap ( ( args ) => f ( ...args ) ) ,
38
+ Stream . flatMap ( ( [ f , args ] ) => f ( ...args ) ) ,
44
39
Stream . tap ( ( value ) =>
45
40
Effect . sync ( ( ) => {
46
41
setResult ( updateNext ( Result . success ( value ) , trackRef ) )
@@ -55,12 +50,23 @@ export const makeUseResultCallback: <R>(
55
50
Runtime . runFork ( runtime )
56
51
)
57
52
}
53
+
58
54
trackRef . current . currentStatus = result . _tag
59
55
60
56
const run = useCallback ( ( ...args : Args ) => {
61
57
trackRef . current . invocationCount ++
62
- queueRef . current ! . unsafeOffer ( args )
63
- } , [ ] )
58
+ queueRef . current ! . unsafeOffer ( [ f , args ] )
59
+ } , [ f ] )
60
+
61
+ useEffect ( ( ) =>
62
+ ( ) => {
63
+ if ( queueRef . current ) {
64
+ Effect . runSync ( Queue . shutdown ( queueRef . current ) )
65
+ }
66
+ if ( fiberRef . current ) {
67
+ Effect . runSync ( Fiber . interruptFork ( fiberRef . current ) )
68
+ }
69
+ } , [ ] )
64
70
65
- return [ resultBag , run , queueRef . current ! ] as const
71
+ return [ resultBag , run ] as const
66
72
}
0 commit comments