@@ -8,7 +8,7 @@ import type { ResultBag } from "effect-react/hooks/useResultBag"
88import { updateNext , useResultBag } from "effect-react/hooks/useResultBag"
99import type { RuntimeContext } from "effect-react/internal/runtimeContext"
1010import * as Result from "effect-react/Result"
11- import { useCallback , useContext , useEffect , useState } from "react"
11+ import { useCallback , useContext , useEffect , useRef , useState } from "react"
1212
1313type FiberState < E > = { readonly _tag : "Idle" } | {
1414 readonly _tag : "Running"
@@ -32,19 +32,20 @@ export const makeUseResultCallback: <R>(
3232 const [ trackRef , resultBag ] = useResultBag ( result )
3333 trackRef . current . currentStatus = result . _tag
3434
35- const [ fiberState , setFiberState ] = useState < FiberState < E > > ( { _tag : "Idle" } )
35+ const fiberState = useRef < FiberState < E > > ( { _tag : "Idle" } )
3636 useEffect ( ( ) =>
3737 ( ) => {
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 ) )
4040 }
4141 } , [ ] )
4242
4343 const runtime = useContext ( runtimeContext )
4444 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" }
4849 }
4950
5051 trackRef . current . invocationCount ++
@@ -69,17 +70,19 @@ export const makeUseResultCallback: <R>(
6970 Effect . onExit ( ( exit ) =>
7071 Exit . isInterrupted ( exit )
7172 ? Effect . unit
72- : Effect . sync ( ( ) => setFiberState ( { _tag : "Idle" } ) )
73+ : Effect . sync ( ( ) => {
74+ fiberState . current = { _tag : "Idle" }
75+ } )
7376 ) ,
7477 Runtime . runFork ( runtime )
7578 )
7679
77- setFiberState ( {
80+ fiberState . current = {
7881 _tag : "Running" ,
7982 fiber,
8083 interruptingRef
81- } )
82- } , [ f , fiberState ] )
84+ }
85+ } , [ f ] )
8386
8487 return [ resultBag , run ] as const
8588 }
0 commit comments