Skip to content

Commit 7ddf75b

Browse files
author
Tim Smart
committed
switch to ref for fiberState
1 parent c2f14be commit 7ddf75b

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

src/hooks/useResultCallback.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type { ResultBag } from "effect-react/hooks/useResultBag"
88
import { updateNext, useResultBag } from "effect-react/hooks/useResultBag"
99
import type { RuntimeContext } from "effect-react/internal/runtimeContext"
1010
import * as Result from "effect-react/Result"
11-
import { useCallback, useContext, useEffect, useState } from "react"
11+
import { useCallback, useContext, useEffect, useRef, useState } from "react"
1212

1313
type 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

Comments
 (0)