import type Cion from '@taiyakihitotsu/cion'; import * as ut from './type-util.js'; export type PrimToTS = S extends `${infer H}${infer _R}` ? S extends 'true' | 'false' ? boolean : H extends '-' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ? number : H extends '"' | `'` ? string : S extends Cion.Builtins ? Function : S extends `(fn [${infer _}` ? Function : S : S; export type KeyName = S extends `:${infer N}` ? N : S; export type _VtoLispM = {}, Key extends string = ''> = V extends [] ? MapStack : V extends [infer F, ...infer R extends unknown[]] ? Key extends '' ? F extends string ? _VtoLispM> : never : _VtoLispM; }, ''> : never; export type VtoLispM = ut.Flatten<_VtoLispM>; export type State = 'map' | 'vec' | 'fn'; export type StackCon = { state: State; stack: unknown[]; }; export type StackPush = Stack extends { state: infer state; stack: infer stack extends unknown[]; } ? { state: state; stack: [...stack, V]; } : never; export type ltcError0 = 'ltcError0'; export type ltcError1 = 'ltcError1'; export type ltcError2 = 'ltcError2'; export type ltcError3 = 'ltcError3'; export type ltcError4 = 'ltcError4'; export type Error = { error: S; }; export type ltCompiler = _ltCompiler; export type _ltCompiler = Parsed extends [] ? Current['stack'][0] : Parsed extends [infer F extends string, ...infer Rest extends string[]] ? F extends '[' | '{' ? Current['state'] extends 'fn' ? _ltCompiler, Stack> : _ltCompiler : F extends '(' ? _ltCompiler : F extends ')' ? Stack extends [ infer Last extends StackCon, ...infer Tail extends StackCon[] ] ? _ltCompiler, Tail> : Error : F extends ']' | '}' ? Current['state'] extends 'fn' ? _ltCompiler, Stack> : Stack extends [ infer Last extends StackCon, ...infer Tail extends StackCon[] ] ? Current['state'] extends 'map' ? _ltCompiler>, Tail> : Current['state'] extends 'vec' ? _ltCompiler, Tail> : Error : Error : _ltCompiler>, Stack> : Error; export type BracketWrap = `[${S}]`; export type BracketUnwrap = S extends [infer F, ...infer _] ? F : never; export type RenameLet = S extends [] ? Stack : S extends [infer F extends string, ...infer Rest extends string[]] ? F extends Before ? RenameLet : RenameLet : never; export type StrMarker = '"' | `'`; export type EndBracket = ')' | ']' | '}'; export type StartBracket = '(' | '[' | '{'; export type Str = S extends [] ? Stack : S extends [infer F extends string, ...infer Rest extends string[]] ? Str : never; export type Ltc = BracketUnwrap>>>; export type Fgensym = Str, n, m, true>>; export * as compiler from './compiler.js';