import { ElementOf, Narrow, transform } from "@re-do/utils" import { parse } from "./parse.js" import { CompileFunction, createCompileFunction } from "./compile.js" import { TypeSet } from "./components" export const createDefineFunctionMap = ( typeNames: DeclaredTypeNames ) => transform(typeNames, ([i, typeName]) => [ typeName as string, createDefineFunction(typeNames, typeName as any) ]) as DefineFunctionMap export type DefineFunctionMap = { [DefinedTypeName in ElementOf]: DefineFunction< DefinedTypeName, DeclaredTypeNames > } export type DefineFunction< DefinedTypeName extends ElementOf, DeclaredTypeNames extends string[] > = ( definition: TypeSet.ValidateReferences< Narrow, ElementOf > ) => { [K in DefinedTypeName]: Def } export const createDefineFunction = < DefinedTypeName extends ElementOf, DeclaredTypeNames extends string[] >( declaredTypeNames: DeclaredTypeNames, definedTypeName: DefinedTypeName ): DefineFunction => (definition: any) => { parse(definition, { typeSet: transform(declaredTypeNames, ([i, typeName]) => [ typeName, "unknown" ]) as any }) return { [definedTypeName]: definition } as any } export type Declaration = { define: DefineFunctionMap compile: CompileFunction } export const declare = ( ...names: Narrow ) => ({ define: createDefineFunctionMap(names), compile: createCompileFunction(names) })