import * as compiler from './compiler.js'; import * as gt from './gensym.js'; import type * as foxpT from './foxp.js'; import type Cion from '@taiyakihitotsu/cion'; import * as ut from './type-util.js'; import { MergePreStr } from './pre.js'; export type MergePreRaw = Env extends [ infer yPre extends string, infer GensymEnvs extends string[] ] ? GensymEnvs extends [] ? [ MergePreStr, compiler.Fgensym>, [rArg, `${xArg}${xApp}`, `${yArg}${yApp}`] ] : GensymEnvs extends string[] ? [ MergePreStr, gt.LoopGensym>, [rArg, `${xArg}${xApp}`, ...gt.LoopAppend] ] : never : never; export type Merge = yPre extends string ? MergePreRaw : MergePreRaw; export declare const anyPres: "(fn [pres] (fn [v] (let [result (reduce (fn [r i] (if (and (second r) (i (first r))) [(first r) true] [(first r) false])) [v true] pres)] (if (second result) (first result) false))))"; export type anyPres = typeof anyPres; export type MergeFoxPre = [ foxpT.GetPre, foxpT.GetPre ] extends [infer fpre extends (string | string[]), infer gpre extends (string | string[])] ? Cion.Lisp<`(${typeof anyPres} ${ArrToVec<[...ForceVec, ...ForceVec]>})`> : never; export type MergeFoxFn = `(fn [n] (-> n ${foxpT.GetFn} ${foxpT.GetFn}))`; export type MergeFox = { sexpr: MergeFoxFn; value: { pre: MergeFoxPre; fn: Function; }; }; export declare const MergeFox: (f: F, g: G) => MergeFox; export type ArrToVec = V extends [] ? RS extends '' ? '' : `${RS}]` : V extends [infer F extends string, ...infer Rest extends string[]] ? RS extends '' ? ArrToVec : ArrToVec : never; export type ForceVec = V extends string[] ? V : [V]; export declare const ForceVec: extends never ? string : S, R = S extends string ? [S] : S>(s: S extends SS ? S : never) => R; export * as merge from './merge.js';