import { coreAST, AST } from './core'; import { createParser } from './parser-ll'; export type ZebuLanguageReturning = { ast: AST; compile: () => void; } & TemplateStringParser; type TemplateStringParser = ( strs: TemplateStringsArray, ...xs: unknown[] ) => Type; export type ZebuLanguage = ZebuLanguageReturning; export function createLanguage(ast: AST): TemplateStringParser { let parser: TemplateStringParser | null = null; function wrappedParser(strs: TemplateStringsArray, ...xs: unknown[]): T { if (!parser) { wrappedParser.compile(); } return parser!(strs, ...xs); } wrappedParser.ast = ast; wrappedParser.compile = () => { parser = createParser(ast); }; return wrappedParser; } const coreParser = createParser(coreAST) as TemplateStringParser; export const lang = ((strs: TemplateStringsArray, ...xs: unknown[]) => { const langAST = coreParser(strs, ...xs); return createLanguage(langAST); }) as ZebuLanguageReturning;