diff --git a/packages/effect-fc/src/Component.ts b/packages/effect-fc/src/Component.ts index 60414ca..25d2cc4 100644 --- a/packages/effect-fc/src/Component.ts +++ b/packages/effect-fc/src/Component.ts @@ -33,7 +33,161 @@ export namespace make { } } -export const 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]) => { + const displayName: string = !String.isEmpty(pipeables[0].name) ? pipeables[0].name : undefined + + return Object.setPrototypeOf({ + body: displayName + ? Effect.fn(displayName)(...pipeables) + : Effect.fn(...pipeables), + displayName, + }, ComponentProto) +} + +export const make_old = < Eff extends Utils.YieldWrap>, P extends {} = {}, >(