diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 9e3b4cc..597c8b5 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -133,6 +133,29 @@ export class Reffuse { ]) } + useMemoScoped( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions & ScopeOptions, + ): A { + const runSync = this.useRunSync() + + const initialValue = React.useMemo(() => runSync(Effect.scoped(effect)), []) + const [value, setValue] = React.useState(initialValue) + + React.useEffect(() => { + const scope = runSync(Scope.make(options?.finalizerExecutionStrategy)) + setValue(runSync(Effect.provideService(effect, Scope.Scope, scope))) + + return () => { runSync(Scope.close(scope, Exit.void)) } + }, [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], + ...(deps ?? []), + ]) + + return value + } + /** * Reffuse equivalent to `React.useEffect`. *