From 87c9c637be88d1931103b178b1c11e891e9c3850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 13 Nov 2025 05:07:13 +0100 Subject: [PATCH] Refactor Component --- packages/effect-fc/src/Component.ts | 82 +++++++++-------------------- 1 file changed, 24 insertions(+), 58 deletions(-) diff --git a/packages/effect-fc/src/Component.ts b/packages/effect-fc/src/Component.ts index 38d8bd0..d773fc3 100644 --- a/packages/effect-fc/src/Component.ts +++ b/packages/effect-fc/src/Component.ts @@ -29,7 +29,7 @@ extends ): (props: P) => A } -export namespace Component { +export declare namespace Component { export type Props> = [T] extends [Component] ? P : never export type Success> = [T] extends [Component] ? A : never export type Error> = [T] extends [Component] ? E : never @@ -93,7 +93,7 @@ const nonReactiveTags = [Tracer.ParentSpan] as const export const isComponent = (u: unknown): u is Component<{}, React.ReactNode, unknown, unknown> => Predicate.hasProperty(u, TypeId) -export namespace make { +export declare namespace make { export type Gen = { >, A extends React.ReactNode, P extends {} = {}>( body: (props: P) => Generator @@ -406,7 +406,7 @@ export class ScopeMap extends Effect.Service()("@effect-fc/Component/S effect: Effect.bind(Effect.Do, "ref", () => Ref.make(HashMap.empty())) }) {} -export namespace ScopeMap { +export declare namespace ScopeMap { export interface Entry { readonly scope: Scope.CloseableScope readonly closeFiber: Option.Option> @@ -414,19 +414,17 @@ export namespace ScopeMap { } -export namespace useScope { +export declare namespace useScope { export interface Options { readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy readonly finalizerExecutionDebounce?: Duration.DurationInput } } -export const useScope: { - ( - deps: React.DependencyList, - options?: useScope.Options, - ): Effect.Effect -} = Effect.fnUntraced(function*(deps, options) { +export const useScope = Effect.fnUntraced(function*( + deps: React.DependencyList, + options?: useScope.Options, +): Effect.fn.Return { // biome-ignore lint/style/noNonNullAssertion: context initialization const runtimeRef = React.useRef>(null!) runtimeRef.current = yield* Effect.runtime() @@ -478,32 +476,22 @@ export const useScope: { return scope }) -export const useOnMount: { - ( - f: () => Effect.Effect - ): Effect.Effect -} = Effect.fnUntraced(function* ( +export const useOnMount = Effect.fnUntraced(function* ( f: () => Effect.Effect -) { +): Effect.fn.Return { const runtime = yield* Effect.runtime() return yield* React.useState(() => Runtime.runSync(runtime)(Effect.cached(f())))[0] }) -export namespace useOnChange { +export declare namespace useOnChange { export interface Options extends useScope.Options {} } -export const useOnChange: { - ( - f: () => Effect.Effect, - deps: React.DependencyList, - options?: useOnChange.Options, - ): Effect.Effect> -} = Effect.fnUntraced(function* ( +export const useOnChange = Effect.fnUntraced(function* ( f: () => Effect.Effect, deps: React.DependencyList, options?: useOnChange.Options, -) { +): Effect.fn.Return> { const runtime = yield* Effect.runtime>() const scope = yield* useScope(deps, options) @@ -513,24 +501,18 @@ export const useOnChange: { ), [scope]) }) -export namespace useReactEffect { +export declare namespace useReactEffect { export interface Options { readonly finalizerExecutionMode?: "sync" | "fork" readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy } } -export const useReactEffect: { - ( - f: () => Effect.Effect, - deps?: React.DependencyList, - options?: useReactEffect.Options, - ): Effect.Effect> -} = Effect.fnUntraced(function* ( +export const useReactEffect = Effect.fnUntraced(function* ( f: () => Effect.Effect, deps?: React.DependencyList, options?: useReactEffect.Options, -) { +): Effect.fn.Return> { const runtime = yield* Effect.runtime>() // biome-ignore lint/correctness/useExhaustiveDependencies: use of React.DependencyList React.useEffect(() => runReactEffect(runtime, f, options), deps) @@ -558,21 +540,15 @@ const runReactEffect = ( Runtime.runSync(runtime), ) -export namespace useReactLayoutEffect { +export declare namespace useReactLayoutEffect { export interface Options extends useReactEffect.Options {} } -export const useReactLayoutEffect: { - ( - f: () => Effect.Effect, - deps?: React.DependencyList, - options?: useReactLayoutEffect.Options, - ): Effect.Effect> -} = Effect.fnUntraced(function* ( +export const useReactLayoutEffect = Effect.fnUntraced(function* ( f: () => Effect.Effect, deps?: React.DependencyList, options?: useReactLayoutEffect.Options, -) { +): Effect.fn.Return> { const runtime = yield* Effect.runtime>() // biome-ignore lint/correctness/useExhaustiveDependencies: use of React.DependencyList React.useLayoutEffect(() => runReactEffect(runtime, f, options), deps) @@ -590,15 +566,10 @@ export const useRunPromise = (): Effect.Effect< Scope.Scope | R > => Effect.andThen(Effect.runtime(), context => Runtime.runPromise(context)) -export const useCallbackSync: { - ( - f: (...args: Args) => Effect.Effect, - deps: React.DependencyList, - ): Effect.Effect<(...args: Args) => A, never, R> -} = Effect.fnUntraced(function* ( +export const useCallbackSync = Effect.fnUntraced(function* ( f: (...args: Args) => Effect.Effect, deps: React.DependencyList, -) { +): Effect.fn.Return<(...args: Args) => A, never, R> { // biome-ignore lint/style/noNonNullAssertion: context initialization const runtimeRef = React.useRef>(null!) runtimeRef.current = yield* Effect.runtime() @@ -607,15 +578,10 @@ export const useCallbackSync: { return React.useCallback((...args: Args) => Runtime.runSync(runtimeRef.current)(f(...args)), deps) }) -export const useCallbackPromise: { - ( - f: (...args: Args) => Effect.Effect, - deps: React.DependencyList, - ): Effect.Effect<(...args: Args) => Promise, never, R> -} = Effect.fnUntraced(function* ( +export const useCallbackPromise = Effect.fnUntraced(function* ( f: (...args: Args) => Effect.Effect, deps: React.DependencyList, -) { +): Effect.fn.Return<(...args: Args) => Promise, never, R> { // biome-ignore lint/style/noNonNullAssertion: context initialization const runtimeRef = React.useRef>(null!) runtimeRef.current = yield* Effect.runtime() @@ -624,7 +590,7 @@ export const useCallbackPromise: { return React.useCallback((...args: Args) => Runtime.runPromise(runtimeRef.current)(f(...args)), deps) }) -export namespace useContext { +export declare namespace useContext { export interface Options extends useOnChange.Options {} }