diff --git a/packages/effect-fc/src/Component.ts b/packages/effect-fc/src/Component.ts index 25d2cc4..e1ecf5d 100644 --- a/packages/effect-fc/src/Component.ts +++ b/packages/effect-fc/src/Component.ts @@ -26,6 +26,151 @@ const nonReactiveTags = [Tracer.ParentSpan] as const export namespace make { + export type Gen = { + >, P extends {} = {}>( + body: (props: P) => Generator, + ): Component< + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never, + P + > + >, AEff, EOut, ROut, P extends {} = {}>( + body: (props: P) => Generator, + a: ( + _: Effect.Effect< + AEff, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never + >, + props: NoInfer

, + ) => Effect.Effect + ): Component + >, AEff, A, EOut, ROut, P extends {} = {}>( + body: (props: P) => Generator, + a: ( + _: Effect.Effect< + AEff, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never + >, + props: NoInfer

, + ) => A, + b: (_: A, props: NoInfer

) => Effect.Effect, + ): Component + >, AEff, A, B, EOut, ROut, P extends {} = {}>( + body: (props: P) => Generator, + a: ( + _: Effect.Effect< + AEff, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never + >, + props: NoInfer

, + ) => A, + b: (_: A, props: NoInfer

) => B, + c: (_: B, props: NoInfer

) => Effect.Effect, + ): Component + >, AEff, A, B, C, EOut, ROut, P extends {} = {}>( + body: (props: P) => Generator, + a: ( + _: Effect.Effect< + AEff, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never + >, + props: NoInfer

, + ) => A, + b: (_: A, props: NoInfer

) => B, + c: (_: B, props: NoInfer

) => C, + d: (_: C, props: NoInfer

) => Effect.Effect, + ): Component + >, AEff, A, B, C, D, EOut, ROut, P extends {} = {}>( + body: (props: P) => Generator, + a: ( + _: Effect.Effect< + AEff, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never + >, + props: NoInfer

, + ) => A, + b: (_: A, props: NoInfer

) => B, + c: (_: B, props: NoInfer

) => C, + d: (_: C, props: NoInfer

) => D, + e: (_: D, props: NoInfer

) => Effect.Effect, + ): Component + >, AEff, A, B, C, D, E, EOut, ROut, P extends {} = {}>( + body: (props: P) => Generator, + a: ( + _: Effect.Effect< + AEff, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never + >, + props: NoInfer

, + ) => A, + b: (_: A, props: NoInfer

) => B, + c: (_: B, props: NoInfer

) => C, + d: (_: C, props: NoInfer

) => D, + e: (_: D, props: NoInfer

) => E, + f: (_: E, props: NoInfer

) => Effect.Effect, + ): Component + >, AEff, A, B, C, D, E, F, EOut, ROut, P extends {} = {}>( + body: (props: P) => Generator, + a: ( + _: Effect.Effect< + AEff, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never + >, + props: NoInfer

, + ) => A, + b: (_: A, props: NoInfer

) => B, + c: (_: B, props: NoInfer

) => C, + d: (_: C, props: NoInfer

) => D, + e: (_: D, props: NoInfer

) => E, + f: (_: E, props: NoInfer

) => F, + g: (_: F, props: NoInfer

) => Effect.Effect, + ): Component + >, AEff, A, B, C, D, E, F, G, EOut, ROut, P extends {} = {}>( + body: (props: P) => Generator, + a: ( + _: Effect.Effect< + AEff, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never + >, + props: NoInfer

, + ) => A, + b: (_: A, props: NoInfer

) => B, + c: (_: B, props: NoInfer

) => C, + d: (_: C, props: NoInfer

) => D, + e: (_: D, props: NoInfer

) => E, + f: (_: E, props: NoInfer

) => F, + g: (_: F, props: NoInfer

) => G, + h: (_: G, props: NoInfer

) => Effect.Effect, + ): Component + >, AEff, A, B, C, D, E, F, G, H, EOut, ROut, P extends {} = {}>( + body: (props: P) => Generator, + a: ( + _: Effect.Effect< + AEff, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, + [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never + >, + props: NoInfer

, + ) => A, + b: (_: A, props: NoInfer

) => B, + c: (_: B, props: NoInfer

) => C, + d: (_: C, props: NoInfer

) => D, + e: (_: D, props: NoInfer

) => E, + f: (_: E, props: NoInfer

) => F, + g: (_: F, props: NoInfer

) => G, + h: (_: G, props: NoInfer

) => H, + i: (_: H, props: NoInfer

) => Effect.Effect, + ): Component + } + export interface Options { readonly untraced?: boolean readonly finalizerExecutionMode?: "sync" | "fork" @@ -33,150 +178,7 @@ export namespace make { } } -export const make: { - >, P extends {} = {}>( - body: (props: P) => Generator, - ): Component< - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never, - P - > - >, AEff, EOut, ROut, P extends {} = {}>( - body: (props: P) => Generator, - a: ( - _: Effect.Effect< - AEff, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never - >, - props: NoInfer

, - ) => Effect.Effect - ): Component - >, AEff, A, EOut, ROut, P extends {} = {}>( - body: (props: P) => Generator, - a: ( - _: Effect.Effect< - AEff, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never - >, - props: NoInfer

, - ) => A, - b: (_: A, props: NoInfer

) => Effect.Effect, - ): Component - >, AEff, A, B, EOut, ROut, P extends {} = {}>( - body: (props: P) => Generator, - a: ( - _: Effect.Effect< - AEff, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never - >, - props: NoInfer

, - ) => A, - b: (_: A, props: NoInfer

) => B, - c: (_: B, props: NoInfer

) => Effect.Effect, - ): Component - >, AEff, A, B, C, EOut, ROut, P extends {} = {}>( - body: (props: P) => Generator, - a: ( - _: Effect.Effect< - AEff, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never - >, - props: NoInfer

, - ) => A, - b: (_: A, props: NoInfer

) => B, - c: (_: B, props: NoInfer

) => C, - d: (_: C, props: NoInfer

) => Effect.Effect, - ): Component - >, AEff, A, B, C, D, EOut, ROut, P extends {} = {}>( - body: (props: P) => Generator, - a: ( - _: Effect.Effect< - AEff, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never - >, - props: NoInfer

, - ) => A, - b: (_: A, props: NoInfer

) => B, - c: (_: B, props: NoInfer

) => C, - d: (_: C, props: NoInfer

) => D, - e: (_: D, props: NoInfer

) => Effect.Effect, - ): Component - >, AEff, A, B, C, D, E, EOut, ROut, P extends {} = {}>( - body: (props: P) => Generator, - a: ( - _: Effect.Effect< - AEff, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never - >, - props: NoInfer

, - ) => A, - b: (_: A, props: NoInfer

) => B, - c: (_: B, props: NoInfer

) => C, - d: (_: C, props: NoInfer

) => D, - e: (_: D, props: NoInfer

) => E, - f: (_: E, props: NoInfer

) => Effect.Effect, - ): Component - >, AEff, A, B, C, D, E, F, EOut, ROut, P extends {} = {}>( - body: (props: P) => Generator, - a: ( - _: Effect.Effect< - AEff, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never - >, - props: NoInfer

, - ) => A, - b: (_: A, props: NoInfer

) => B, - c: (_: B, props: NoInfer

) => C, - d: (_: C, props: NoInfer

) => D, - e: (_: D, props: NoInfer

) => E, - f: (_: E, props: NoInfer

) => F, - g: (_: F, props: NoInfer

) => Effect.Effect, - ): Component - >, AEff, A, B, C, D, E, F, G, EOut, ROut, P extends {} = {}>( - body: (props: P) => Generator, - a: ( - _: Effect.Effect< - AEff, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never - >, - props: NoInfer

, - ) => A, - b: (_: A, props: NoInfer

) => B, - c: (_: B, props: NoInfer

) => C, - d: (_: C, props: NoInfer

) => D, - e: (_: D, props: NoInfer

) => E, - f: (_: E, props: NoInfer

) => F, - g: (_: F, props: NoInfer

) => G, - h: (_: G, props: NoInfer

) => Effect.Effect, - ): Component - >, AEff, A, B, C, D, E, F, G, H, EOut, ROut, P extends {} = {}>( - body: (props: P) => Generator, - a: ( - _: Effect.Effect< - AEff, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never - >, - props: NoInfer

, - ) => A, - b: (_: A, props: NoInfer

) => B, - c: (_: B, props: NoInfer

) => C, - d: (_: C, props: NoInfer

) => D, - e: (_: D, props: NoInfer

) => E, - f: (_: E, props: NoInfer

) => F, - g: (_: F, props: NoInfer

) => G, - h: (_: G, props: NoInfer

) => H, - i: (_: H, props: NoInfer

) => Effect.Effect, - ): Component -} = (...pipeables: readonly [any]) => { +export const make: make.Gen = (...pipeables: readonly [any]) => { const displayName: string = !String.isEmpty(pipeables[0].name) ? pipeables[0].name : undefined return Object.setPrototypeOf({ @@ -187,30 +189,10 @@ export const make: { }, ComponentProto) } -export const make_old = < - Eff extends Utils.YieldWrap>, - P extends {} = {}, ->( - body: (props: P) => Generator, - options?: make.Options, -): Component< - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? E : never, - [Eff] extends [never] ? never : [Eff] extends [Utils.YieldWrap>] ? R : never, - P -> => { - const displayName = !String.isEmpty(body.name) ? body.name : undefined - - return Object.setPrototypeOf({ - body: options?.untraced - ? Effect.fnUntraced(body) - : displayName - ? Effect.fn(displayName)(body) - : Effect.fn(body), - displayName, - finalizerExecutionMode: options?.finalizerExecutionMode ?? "sync", - finalizerExecutionStrategy: options?.finalizerExecutionStrategy ?? ExecutionStrategy.sequential, - }, ComponentProto) -} +export const makeUntraced: make.Gen = (...pipeables: readonly [any]) => Object.setPrototypeOf({ + body: Effect.fnUntraced(...pipeables), + displayName: !String.isEmpty(pipeables[0].name) ? pipeables[0].name : undefined, +}, ComponentProto) export const withRuntime: {