@@ -9,16 +9,30 @@ import type { RuntimeContext } from "effect-react/internal/runtimeContext"
9
9
import * as Result from "effect-react/Result"
10
10
import { useCallback , useContext , useEffect , useRef , useState } from "react"
11
11
12
+ interface UseResultCallbackOptions {
13
+ /**
14
+ * Determines on-change behavior
15
+ * If this is true, effects and streams from callbacks will be run through
16
+ * on a best-effort basis instead of interrupting.
17
+ * Before using this option, check if you do not actually want to use `Effect.uninterruptible` instead.
18
+ */
19
+ uninterruptible ?: true
20
+ }
21
+
12
22
export type UseResultCallback < R > = < Args extends Array < any > , R0 extends R , E , A > (
13
- callback : ( ...args : Args ) => Effect . Effect < R0 , E , A >
23
+ callback : ( ...args : Args ) => Effect . Effect < R0 , E , A > ,
24
+ options ?: UseResultCallbackOptions
14
25
) => readonly [ ResultBag < E , A > , ( ...args : Args ) => void ]
15
26
16
27
export const makeUseResultCallback : < R > (
17
28
runtimeContext : RuntimeContext < R >
18
29
) => UseResultCallback < R > = < R > (
19
30
runtimeContext : RuntimeContext < R >
20
31
) =>
21
- < Args extends Array < any > , R0 extends R , E , A > ( f : ( ...args : Args ) => Stream . Stream < R0 , E , A > ) => {
32
+ < Args extends Array < any > , R0 extends R , E , A > (
33
+ f : ( ...args : Args ) => Stream . Stream < R0 , E , A > ,
34
+ options ?: UseResultCallbackOptions
35
+ ) => {
22
36
const runtime = useContext ( runtimeContext )
23
37
const fiberRef = useRef < Fiber . RuntimeFiber < E , void > > ( )
24
38
const queueRef = useRef < Queue . Queue < [ ( ...args : Args ) => Stream . Stream < R0 , E , A > , Args ] > > ( )
@@ -35,7 +49,7 @@ export const makeUseResultCallback: <R>(
35
49
setResult ( ( prev ) => updateNext ( Result . waiting ( prev ) , trackRef ) )
36
50
} )
37
51
) ,
38
- Stream . flatMap ( ( [ f , args ] ) => f ( ...args ) ) ,
52
+ Stream . flatMap ( ( [ f , args ] ) => f ( ...args ) , { switch : ! options ?. uninterruptible } ) ,
39
53
Stream . tap ( ( value ) =>
40
54
Effect . sync ( ( ) => {
41
55
setResult ( updateNext ( Result . success ( value ) , trackRef ) )
0 commit comments