1import * as S from "effect/Schema";
2
3export 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
15export 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
45const 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;