From dcb6cf30b21f7b7b80511938875a7e12a374570a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 23 Jul 2025 16:00:57 +0200 Subject: [PATCH] Refactoring --- packages/effect-fc/src/Component.ts | 71 ++++++++++++++--------------- packages/effect-fc/src/Suspense.ts | 8 ++-- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/packages/effect-fc/src/Component.ts b/packages/effect-fc/src/Component.ts index be8bee7..bc10ac6 100644 --- a/packages/effect-fc/src/Component.ts +++ b/packages/effect-fc/src/Component.ts @@ -7,7 +7,7 @@ import * as Memoized from "./Memoized.js" export const TypeId: unique symbol = Symbol.for("effect-fc/Component") export type TypeId = typeof TypeId -export interface Component +export interface Component

extends Effect.Effect, never, Exclude>, Component.Options { new(_: never): {} readonly [TypeId]: TypeId @@ -18,9 +18,9 @@ extends Effect.Effect, never, Exclude>, Component.Op } export namespace Component { - export type Error = T extends Component ? E : never - export type Context = T extends Component ? R : never - export type Props = T extends Component ? P : never + export type Props = T extends Component ? P : never + export type Error = T extends Component ? E : never + export type Context = T extends Component ? R : never export interface Options { readonly displayName?: string @@ -34,7 +34,7 @@ const ComponentProto = Object.freeze({ ...Effectable.CommitPrototype, [TypeId]: TypeId, - commit: Effect.fnUntraced(function* (this: Component) { + commit: Effect.fnUntraced(function*

(this: Component) { const self = this const runtimeRef = React.useRef>>(null!) runtimeRef.current = yield* Effect.runtime>() @@ -59,8 +59,8 @@ const ComponentProto = Object.freeze({ }, []) }), - makeFunctionComponent ( - this: Component, + makeFunctionComponent

( + this: Component, runtimeRef: React.RefObject>>, scope: Scope.Scope, ): React.FC

{ @@ -77,17 +77,16 @@ const defaultOptions = { const nonReactiveTags = [Tracer.ParentSpan] as const - -export const isComponent = (u: unknown): u is Component => Predicate.hasProperty(u, TypeId) +export const isComponent = (u: unknown): u is Component<{}, unknown, unknown> => Predicate.hasProperty(u, TypeId) export namespace make { export type Gen = { >, P extends {} = {}>( body: (props: P) => Generator, ): Component< + P, [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never, - P + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never > >, A, B extends Effect.Effect, P extends {} = {}>( body: (props: P) => Generator, @@ -99,7 +98,7 @@ export namespace make { >, props: NoInfer

, ) => B - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> >, A, B, C extends Effect.Effect, P extends {} = {}>( body: (props: P) => Generator, a: ( @@ -111,7 +110,7 @@ export namespace make { props: NoInfer

, ) => B, b: (_: B, props: NoInfer

) => C, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> >, A, B, C, D extends Effect.Effect, P extends {} = {}>( body: (props: P) => Generator, a: ( @@ -124,7 +123,7 @@ export namespace make { ) => B, b: (_: B, props: NoInfer

) => C, c: (_: C, props: NoInfer

) => D, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> >, A, B, C, D, E extends Effect.Effect, P extends {} = {}>( body: (props: P) => Generator, a: ( @@ -138,7 +137,7 @@ export namespace make { b: (_: B, props: NoInfer

) => C, c: (_: C, props: NoInfer

) => D, d: (_: D, props: NoInfer

) => E, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> >, A, B, C, D, E, F extends Effect.Effect, P extends {} = {}>( body: (props: P) => Generator, a: ( @@ -153,7 +152,7 @@ export namespace make { c: (_: C, props: NoInfer

) => D, d: (_: D, props: NoInfer

) => E, e: (_: E, props: NoInfer

) => F, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> >, A, B, C, D, E, F, G extends Effect.Effect, P extends {} = {}>( body: (props: P) => Generator, a: ( @@ -169,7 +168,7 @@ export namespace make { d: (_: D, props: NoInfer

) => E, e: (_: E, props: NoInfer

) => F, f: (_: F, props: NoInfer

) => G, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> >, A, B, C, D, E, F, G, H extends Effect.Effect, P extends {} = {}>( body: (props: P) => Generator, a: ( @@ -186,7 +185,7 @@ export namespace make { e: (_: E, props: NoInfer

) => F, f: (_: F, props: NoInfer

) => G, g: (_: G, props: NoInfer

) => H, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> >, A, B, C, D, E, F, G, H, I extends Effect.Effect, P extends {} = {}>( body: (props: P) => Generator, a: ( @@ -204,7 +203,7 @@ export namespace make { f: (_: F, props: NoInfer

) => G, g: (_: G, props: NoInfer

) => H, h: (_: H, props: NoInfer

) => I, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> >, A, B, C, D, E, F, G, H, I, J extends Effect.Effect, P extends {} = {}>( body: (props: P) => Generator, a: ( @@ -223,35 +222,35 @@ export namespace make { g: (_: G, props: NoInfer

) => H, h: (_: H, props: NoInfer

) => I, i: (_: I, props: NoInfer

) => J, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> } export type NonGen = { , P extends {} = {}>( body: (props: P) => Eff - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> , A, P extends {} = {}>( body: (props: P) => A, a: (_: A, props: NoInfer

) => Eff, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> , A, B, P extends {} = {}>( body: (props: P) => A, a: (_: A, props: NoInfer

) => B, b: (_: B, props: NoInfer

) => Eff, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> , A, B, C, P extends {} = {}>( body: (props: P) => A, a: (_: A, props: NoInfer

) => B, b: (_: B, props: NoInfer

) => C, c: (_: C, props: NoInfer

) => Eff, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> , A, B, C, D, P extends {} = {}>( body: (props: P) => A, a: (_: A, props: NoInfer

) => B, b: (_: B, props: NoInfer

) => C, c: (_: C, props: NoInfer

) => D, d: (_: D, props: NoInfer

) => Eff, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> , A, B, C, D, E, P extends {} = {}>( body: (props: P) => A, a: (_: A, props: NoInfer

) => B, @@ -259,7 +258,7 @@ export namespace make { c: (_: C, props: NoInfer

) => D, d: (_: D, props: NoInfer

) => E, e: (_: E, props: NoInfer

) => Eff, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> , A, B, C, D, E, F, P extends {} = {}>( body: (props: P) => A, a: (_: A, props: NoInfer

) => B, @@ -268,7 +267,7 @@ export namespace make { d: (_: D, props: NoInfer

) => E, e: (_: E, props: NoInfer

) => F, f: (_: F, props: NoInfer

) => Eff, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> , A, B, C, D, E, F, G, P extends {} = {}>( body: (props: P) => A, a: (_: A, props: NoInfer

) => B, @@ -278,7 +277,7 @@ export namespace make { e: (_: E, props: NoInfer

) => F, f: (_: F, props: NoInfer

) => G, g: (_: G, props: NoInfer

) => Eff, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> , A, B, C, D, E, F, G, H, P extends {} = {}>( body: (props: P) => A, a: (_: A, props: NoInfer

) => B, @@ -289,7 +288,7 @@ export namespace make { f: (_: F, props: NoInfer

) => G, g: (_: G, props: NoInfer

) => H, h: (_: H, props: NoInfer

) => Eff, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> , A, B, C, D, E, F, G, H, I, P extends {} = {}>( body: (props: P) => A, a: (_: A, props: NoInfer

) => B, @@ -301,7 +300,7 @@ export namespace make { g: (_: G, props: NoInfer

) => H, h: (_: H, props: NoInfer

) => I, i: (_: I, props: NoInfer

) => Eff, - ): Component, Effect.Effect.Context, P> + ): Component, Effect.Effect.Context> } } @@ -367,15 +366,15 @@ export const withOptions: { )) export const withRuntime: { - ( +

( context: React.Context>, - ): (self: Component) => React.FC

- ( - self: Component, + ): (self: Component) => React.FC

+

( + self: Component, context: React.Context>, ): React.FC

-} = Function.dual(2, ( - self: Component, +} = Function.dual(2,

( + self: Component, context: React.Context>, ): React.FC

=> function WithRuntime(props) { const runtime = React.useContext(context) diff --git a/packages/effect-fc/src/Suspense.ts b/packages/effect-fc/src/Suspense.ts index 7913fb8..a8bbe58 100644 --- a/packages/effect-fc/src/Suspense.ts +++ b/packages/effect-fc/src/Suspense.ts @@ -46,11 +46,11 @@ const SuspenseProto = Object.freeze({ export const isSuspense = (u: unknown): u is Suspense => Predicate.hasProperty(u, TypeId) -export const suspense = , P extends {}>( - self: T & Component.Component> +export const suspense = , P extends {}>( + self: T & Component.Component, any, any> ): ( - & Omit, Component.Component.Context, P>> - & Component.Component, Component.Component.Context, P & Suspense.Props> + & Omit, Component.Component.Context>> + & Component.Component

, Component.Component.Context> & Suspense ) => Object.setPrototypeOf( Object.assign(function() {}, self, SuspenseProto),