Skip to content

Commit 19d8a70

Browse files
author
Datner
committed
fix: change interruption lifecycle
hopefully this would solve it. Thanks @TimSmart!
1 parent f406eba commit 19d8a70

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

src/hooks/useResultCallback.ts

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

1212
export type UseResultCallback<R> = <Args extends Array<any>, R0 extends R, E, A>(
1313
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]
1515

1616
export const makeUseResultCallback: <R>(
1717
runtimeContext: RuntimeContext<R>
@@ -21,26 +21,21 @@ export const makeUseResultCallback: <R>(
2121
<Args extends Array<any>, R0 extends R, E, A>(f: (...args: Args) => Stream.Stream<R0, E, A>) => {
2222
const runtime = useContext(runtimeContext)
2323
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]>>()
2625
if (!queueRef.current) {
2726
queueRef.current = Effect.runSync(Queue.unbounded())
2827
}
2928
const [result, setResult] = useState<Result.Result<E, A>>(Result.initial())
3029
const [trackRef, resultBag] = useResultBag(result)
3130

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) {
3732
fiberRef.current = Stream.fromQueue(queueRef.current).pipe(
3833
Stream.tap(() =>
3934
Effect.sync(() => {
4035
setResult((prev) => updateNext(Result.waiting(prev), trackRef))
4136
})
4237
),
43-
Stream.flatMap((args) => f(...args)),
38+
Stream.flatMap(([f, args]) => f(...args)),
4439
Stream.tap((value) =>
4540
Effect.sync(() => {
4641
setResult(updateNext(Result.success(value), trackRef))
@@ -55,12 +50,23 @@ export const makeUseResultCallback: <R>(
5550
Runtime.runFork(runtime)
5651
)
5752
}
53+
5854
trackRef.current.currentStatus = result._tag
5955

6056
const run = useCallback((...args: Args) => {
6157
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+
}, [])
6470

65-
return [resultBag, run, queueRef.current!] as const
71+
return [resultBag, run] as const
6672
}

0 commit comments

Comments
 (0)