@@ -7,11 +7,11 @@ import type { ResultBag } from "effect-react/hooks/useResultBag"
77import { updateNext , useResultBag } from "effect-react/hooks/useResultBag"
88import type { RuntimeContext } from "effect-react/internal/runtimeContext"
99import * as Result from "effect-react/Result"
10- import { useCallback , useContext , useRef , useState } from "react"
10+ import { useCallback , useContext , useEffect , useRef , useState } from "react"
1111
1212export 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
1616export 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