From 95f53b8a009c5e89fff95fdce98cd0ac623b02f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 30 Oct 2025 11:58:06 +0100 Subject: [PATCH] Add useOnMountResult --- packages/effect-fc/src/Component.ts | 31 ++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/effect-fc/src/Component.ts b/packages/effect-fc/src/Component.ts index c2823b8..ed24655 100644 --- a/packages/effect-fc/src/Component.ts +++ b/packages/effect-fc/src/Component.ts @@ -514,13 +514,38 @@ export const useOnChange: { ), [scope]) }) -export namespace useOnChangeResult { - export interface Options - extends Result.forkEffectScoped.Options

, useReactEffect.Options { +export namespace useOnMountResult { + export interface Options extends Result.forkEffectScoped.Options

{ readonly equivalence?: Equivalence.Equivalence> } } +export const useOnMountResult: { + ( + f: () => Effect.Effect>>, + options?: useOnChangeResult.Options, + ): Effect.Effect, never, Result.forkEffectScoped.OutputContext> +} = Effect.fnUntraced(function* ( + f: () => Effect.Effect>>, + options?: useOnChangeResult.Options, +) { + const [result, setResult] = React.useState(() => Result.initial() as Result.Result) + + yield* useOnMount(() => Result.forkEffectScoped(f(), options).pipe( + Effect.andThen(Stream.fromQueue), + Stream.unwrap, + Stream.changesWith(options?.equivalence ?? Equivalence.strict()), + Stream.runForEach(result => Effect.sync(() => setResult(result))), + )) + + return result +}) + +export namespace useOnChangeResult { + export interface Options + extends useOnMountResult.Options, useReactEffect.Options {} +} + export const useOnChangeResult: { ( f: () => Effect.Effect>>,