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';