| 1 | import * as S from "effect/Schema"; |
| 2 | |
| 3 | export type Parameter< |
| 4 | Name extends string = string, |
| 5 | Schema extends S.Top = S.Top, |
| 6 | Refs extends any[] = any[], |
| 7 | > = { |
| 8 | "~alchemy/Kind": "Param"; |
| 9 | "~alchemy/Name": Name; |
| 10 | schema: Schema; |
| 11 | template: TemplateStringsArray; |
| 12 | refs: Refs; |
| 13 | }; |
| 14 | |
| 15 | export const Parameter: { |
| 16 | <const Name extends string>( |
| 17 | name: Name, |
| 18 | ): { |
| 19 | <Schema extends S.Top>( |
| 20 | schema: Schema, |
| 21 | ): { |
| 22 | <Refs extends any[]>( |
| 23 | template: TemplateStringsArray, |
| 24 | ...refs: Refs |
| 25 | ): Parameter<Name, Schema, Refs>; |
| 26 | }; |
| 27 | }; |
| 28 | <const Name extends string, Schema extends S.Top>( |
| 29 | name: Name, |
| 30 | schema: Schema, |
| 31 | ): { |
| 32 | <Refs extends any[]>( |
| 33 | template: TemplateStringsArray, |
| 34 | ...refs: Refs |
| 35 | ): Parameter<Name, Schema, Refs>; |
| 36 | }; |
| 37 | } = ((name: string, schema?: S.Top) => |
| 38 | schema |
| 39 | ? (template: TemplateStringsArray, ...refs: any[]) => |
| 40 | makeParameter(name, schema, template, refs) |
| 41 | : (schema: S.Top) => |
| 42 | (template: TemplateStringsArray, ...refs: any[]) => |
| 43 | makeParameter(name, schema, template, refs)) as any; |
| 44 | |
| 45 | const makeParameter = ( |
| 46 | name: string, |
| 47 | schema: S.Top, |
| 48 | template: TemplateStringsArray, |
| 49 | refs: any[], |
| 50 | ) => |
| 51 | Object.assign(function () {}, { |
| 52 | "~alchemy/Kind": "Param", |
| 53 | "~alchemy/Name": name, |
| 54 | schema, |
| 55 | template, |
| 56 | refs, |
| 57 | }) as any; |