From c1705c1587ce70f0269892f239bbf0ce0c74e576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 14 Nov 2025 02:41:17 +0100 Subject: [PATCH] Refactor --- packages/effect-fc/src/Subscribable.ts | 21 ++++++--------- packages/effect-fc/src/SubscriptionRef.ts | 32 +++++++++-------------- 2 files changed, 21 insertions(+), 32 deletions(-) diff --git a/packages/effect-fc/src/Subscribable.ts b/packages/effect-fc/src/Subscribable.ts index ce70ff1..138f16e 100644 --- a/packages/effect-fc/src/Subscribable.ts +++ b/packages/effect-fc/src/Subscribable.ts @@ -1,4 +1,4 @@ -import { Effect, Equivalence, type Scope, Stream, Subscribable } from "effect" +import { Effect, Equivalence, Stream, Subscribable } from "effect" import * as React from "react" import * as Component from "./Component.js" @@ -16,7 +16,7 @@ export const zipLatestAll = v.changes)), }) as any -export namespace useSubscribables { +export declare namespace useSubscribables { export type Success[]> = [T[number]] extends [never] ? never : { [K in keyof T]: T[K] extends Subscribable.Subscribable ? A : never } @@ -26,19 +26,14 @@ export namespace useSubscribables { } } -export const useSubscribables: { - []>( - elements: T, - options?: useSubscribables.Options>>, - ): Effect.Effect< - useSubscribables.Success, - [T[number]] extends [never] ? never : T[number] extends Subscribable.Subscribable ? E : never, - Scope.Scope | ([T[number]] extends [never] ? never : T[number] extends Subscribable.Subscribable ? R : never) - > -} = Effect.fnUntraced(function* []>( +export const useSubscribables = Effect.fnUntraced(function* []>( elements: T, options?: useSubscribables.Options>>, -) { +): Effect.fn.Return< + useSubscribables.Success, + [T[number]] extends [never] ? never : T[number] extends Subscribable.Subscribable ? E : never, + [T[number]] extends [never] ? never : T[number] extends Subscribable.Subscribable ? R : never +> { const [reactStateValue, setReactStateValue] = React.useState( yield* Component.useOnMount(() => Effect.all(elements.map(v => v.get))) ) diff --git a/packages/effect-fc/src/SubscriptionRef.ts b/packages/effect-fc/src/SubscriptionRef.ts index f8ead11..0671ec5 100644 --- a/packages/effect-fc/src/SubscriptionRef.ts +++ b/packages/effect-fc/src/SubscriptionRef.ts @@ -1,24 +1,19 @@ -import { Effect, Equivalence, Ref, type Scope, Stream, SubscriptionRef } from "effect" +import { Effect, Equivalence, Ref, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as Component from "./Component.js" import * as SetStateAction from "./SetStateAction.js" -export namespace useSubscriptionRefState { +export declare namespace useSubscriptionRefState { export interface Options { readonly equivalence?: Equivalence.Equivalence } } -export const useSubscriptionRefState: { - ( - ref: SubscriptionRef.SubscriptionRef, - options?: useSubscriptionRefState.Options>, - ): Effect.Effect>], never, Scope.Scope> -} = Effect.fnUntraced(function* ( +export const useSubscriptionRefState = Effect.fnUntraced(function* ( ref: SubscriptionRef.SubscriptionRef, options?: useSubscriptionRefState.Options>, -) { +): Effect.fn.Return>]> { const [reactStateValue, setReactStateValue] = React.useState(yield* Component.useOnMount(() => ref)) yield* Component.useReactEffect(() => Effect.forkScoped( @@ -28,28 +23,27 @@ export const useSubscriptionRefState: { ) ), [ref]) - const setValue = yield* Component.useCallbackSync((setStateAction: React.SetStateAction) => - Effect.andThen( + const setValue = yield* Component.useCallbackSync( + (setStateAction: React.SetStateAction) => Effect.andThen( Ref.updateAndGet(ref, prevState => SetStateAction.value(setStateAction, prevState)), v => setReactStateValue(v), ), - [ref]) + [ref], + ) return [reactStateValue, setValue] }) -export namespace useSubscriptionRefFromState { +export declare namespace useSubscriptionRefFromState { export interface Options { readonly equivalence?: Equivalence.Equivalence } } -export const useSubscriptionRefFromState: { - ( - state: readonly [A, React.Dispatch>], - options?: useSubscriptionRefFromState.Options>, - ): Effect.Effect, never, Scope.Scope> -} = Effect.fnUntraced(function*([value, setValue], options) { +export const useSubscriptionRefFromState = Effect.fnUntraced(function* ( + [value, setValue]: readonly [A, React.Dispatch>], + options?: useSubscriptionRefFromState.Options>, +): Effect.fn.Return> { const ref = yield* Component.useOnChange(() => Effect.tap( SubscriptionRef.make(value), ref => Effect.forkScoped(