import type Cion from '@taiyakihitotsu/cion';
import * as typeUtil from './type-util.js';
import type { LispFalsy } from './type-util.js';
import * as compiler from './compiler.js';
import { const as c } from './const.js';
import * as ut from './type-util.js';
import * as fraction from './fraction.js';
export type IsFnForm
= [P, Symbol] extends [string, compiler.PrimToTS
] ? true : false;
export type _LispString = `'${S}'`;
export type ToLispString = T extends `:${infer K}` ? `:${K}` : T extends string ? [fraction.isRational, _LispString] extends [true, `'${infer N}'`] ? N : _LispString : `${T}`;
type SymSig = {
[c.FnFlagKey]: true;
};
type Rec = Record | Readonly>;
type Arr = unknown[] | readonly unknown[];
export type DeeplySymSearch = Data extends SymSig ? true : Data extends [infer F, ...infer T] ? F extends SymSig ? true : F extends Rec | Arr ? false extends DeeplySymSearch ? DeeplySymSearch : true : T extends [] ? false : DeeplySymSearch : Data extends Rec ? DeeplySymSearch<{
[K in keyof Data]: Data[K];
}[keyof Data]> extends false ? false : true : false;
export type LispWrapedMapWith = {
[c.SexprKey]: typeUtil.RtoS;
[c.ContKey]: typeUtil.RtoS;
[c.FnFlagKey]: DeeplySymSearch;
[c.ValueKey]: T;
[c.HofFlag]: false;
};
export declare const putRecord: >(v: V extends (ut.ForceReadRecord extends never ? never : V) ? V : never) => LispWrapedMapWith;
export type LispWrapedVecWith = {
[c.SexprKey]: typeUtil.VtoS;
[c.ContKey]: typeUtil.VtoS;
[c.FnFlagKey]: DeeplySymSearch;
[c.ValueKey]: T;
[c.HofFlag]: false;
};
export declare const putVec: extends never ? V["length"] extends 0 ? V : never : V), Vpass extends (V extends ut.Tuple ? V : never)>(v: V extends Vpre ? V : never) => LispWrapedVecWith;
export type LispWrapedFnValue = {
fn: T;
pre: Pre;
};
export type LispWrapedFnWith = {
[c.SexprKey]: F;
[c.ContKey]: F;
[c.FnFlagKey]: false;
[c.ValueKey]: LispWrapedFnValue;
[c.HofFlag]: false;
};
export declare const putFn1: () => (f: T) => LispWrapedFnWith;
export type LispWrapedPrimWith = {
[c.SexprKey]: ToLispString;
[c.ContKey]: ToLispString;
[c.ValueKey]: R;
[c.FnFlagKey]: IsFnForm;
[c.HofFlag]: false;
};
export declare const putPrim: extends true ? number : V)>(v: V) => LispWrapedPrimWith;
export declare const putSym: (s: Sym, v: V) => {
[c.SexprKey]: Sym;
[c.ContKey]: Sym;
[c.FnFlagKey]: true;
[c.ValueKey]: Symbol;
[c.HofFlag]: false;
};
export declare const putNil: (n: N) => {
[c.SexprKey]: "nil";
[c.ContKey]: "nil";
[c.FnFlagKey]: false;
[c.ValueKey]: N;
[c.HofFlag]: false;
};
export declare const tid: () => (value: U extends (Cion.Lisp<`(${T} ${U[c.SexprKey] extends string ? U[c.SexprKey] : never})`> extends LispFalsy ? never : U) ? U : never) => U;
export declare const ro: >(u: U) => ut.DeepReadonly;
export declare const tap1: , RetType extends (_RetType extends Function ? {
[c.PreKey]: F[c.ValueKey][c.PreKey][1];
[c.FnKey]: _RetType;
} : _RetType), BPre extends `(${F[c.ValueKey][c.PreKey] extends string ? F[c.ValueKey][c.PreKey] : F[c.ValueKey][c.PreKey][0]} ${S[c.SexprKey]})`, BCont extends `(${F[c.SexprKey]} ${S[c.SexprKey]})`, BPost extends Cion.Lisp>(lf: F, a: S extends (Cion.Lisp extends LispFalsy ? never : S) ? S : never) => {
[c.SexprKey]: BPost;
[c.ValueKey]: RetType;
};
export type Foxelement = {
[c.SexprKey]: string;
[c.ValueKey]: ut.Primitive | unknown[] | Record | Function;
} | Foxfn;
export type Foxfn = {
[c.SexprKey]: string;
[c.ValueKey]: {
[c.PreKey]: string | string[];
[c.FnKey]: Function;
};
};
export type GetPre = S[c.ValueKey][c.PreKey];
export type GetFn = S[c.SexprKey];
export * as foxp from './foxp.js';