@@ -8,7 +8,7 @@ import type { ResultBag } from "effect-react/hooks/useResultBag"
8
8
import { updateNext , useResultBag } from "effect-react/hooks/useResultBag"
9
9
import type { RuntimeContext } from "effect-react/internal/runtimeContext"
10
10
import * as Result from "effect-react/Result"
11
- import { useCallback , useContext , useEffect , useState } from "react"
11
+ import { useCallback , useContext , useEffect , useRef , useState } from "react"
12
12
13
13
type FiberState < E > = { readonly _tag : "Idle" } | {
14
14
readonly _tag : "Running"
@@ -32,19 +32,20 @@ export const makeUseResultCallback: <R>(
32
32
const [ trackRef , resultBag ] = useResultBag ( result )
33
33
trackRef . current . currentStatus = result . _tag
34
34
35
- const [ fiberState , setFiberState ] = useState < FiberState < E > > ( { _tag : "Idle" } )
35
+ const fiberState = useRef < FiberState < E > > ( { _tag : "Idle" } )
36
36
useEffect ( ( ) =>
37
37
( ) => {
38
- if ( fiberState . _tag === "Running" ) {
39
- Effect . runFork ( Fiber . interruptFork ( fiberState . fiber ) )
38
+ if ( fiberState . current . _tag === "Running" ) {
39
+ Effect . runFork ( Fiber . interruptFork ( fiberState . current . fiber ) )
40
40
}
41
41
} , [ ] )
42
42
43
43
const runtime = useContext ( runtimeContext )
44
44
const run = useCallback ( ( ...args : Args ) => {
45
- if ( fiberState . _tag === "Running" ) {
46
- Effect . runSync ( Ref . set ( fiberState . interruptingRef , true ) )
47
- Effect . runFork ( Fiber . interruptFork ( fiberState . fiber ) )
45
+ if ( fiberState . current . _tag === "Running" ) {
46
+ Effect . runSync ( Ref . set ( fiberState . current . interruptingRef , true ) )
47
+ Effect . runFork ( Fiber . interruptFork ( fiberState . current . fiber ) )
48
+ fiberState . current = { _tag : "Idle" }
48
49
}
49
50
50
51
trackRef . current . invocationCount ++
@@ -69,17 +70,19 @@ export const makeUseResultCallback: <R>(
69
70
Effect . onExit ( ( exit ) =>
70
71
Exit . isInterrupted ( exit )
71
72
? Effect . unit
72
- : Effect . sync ( ( ) => setFiberState ( { _tag : "Idle" } ) )
73
+ : Effect . sync ( ( ) => {
74
+ fiberState . current = { _tag : "Idle" }
75
+ } )
73
76
) ,
74
77
Runtime . runFork ( runtime )
75
78
)
76
79
77
- setFiberState ( {
80
+ fiberState . current = {
78
81
_tag : "Running" ,
79
82
fiber,
80
83
interruptingRef
81
- } )
82
- } , [ f , fiberState ] )
84
+ }
85
+ } , [ f ] )
83
86
84
87
return [ resultBag , run ] as const
85
88
}
0 commit comments