Cosmetic: rename function, rearrange functions
This commit is contained in:
parent
2b9eddfc79
commit
ce947c109a
|
@ -22,16 +22,6 @@ export function compile(env: Environment, schema: Schema, options: CompilerOptio
|
|||
let temps: Array<string> = [];
|
||||
const pointerName = Schema._.details(schema).get(M.$pointer);
|
||||
|
||||
function applyPredicate(name: Ref, v: string): Item {
|
||||
return lookup(refPosition(name), name, env,
|
||||
(_p) => `is${Ref._.name(name).description!}(${v})`,
|
||||
(p) => walk(v, p),
|
||||
(mod, modPath, _p) => {
|
||||
imports.add([mod, modPath]);
|
||||
return `${mod}.is${Ref._.name(name).description!}(${v})`;
|
||||
});
|
||||
}
|
||||
|
||||
function gentemp(): string {
|
||||
const varname = '_tmp' + temps.length;
|
||||
temps.push(varname);
|
||||
|
@ -107,7 +97,17 @@ export function compile(env: Environment, schema: Schema, options: CompilerOptio
|
|||
}
|
||||
}
|
||||
|
||||
function walk(v: string, p: Pattern, recordOkAsTuple = false): Item {
|
||||
function applyPredicate(name: Ref, v: string): Item {
|
||||
return lookup(refPosition(name), name, env,
|
||||
(_p) => `is${Ref._.name(name).description!}(${v})`,
|
||||
(p) => predicateFor(v, p),
|
||||
(mod, modPath, _p) => {
|
||||
imports.add([mod, modPath]);
|
||||
return `${mod}.is${Ref._.name(name).description!}(${v})`;
|
||||
});
|
||||
}
|
||||
|
||||
function predicateFor(v: string, p: Pattern, recordOkAsTuple = false): Item {
|
||||
switch (p.label) {
|
||||
case M.$atom:
|
||||
switch (p[0]) {
|
||||
|
@ -124,22 +124,22 @@ export function compile(env: Environment, schema: Schema, options: CompilerOptio
|
|||
case M.$ref:
|
||||
return applyPredicate(p, v);
|
||||
case M.$or:
|
||||
return opseq('false', ' || ', ... p[0].map(pp => walk(v, pp)));
|
||||
return opseq('false', ' || ', ... p[0].map(pp => predicateFor(v, pp)));
|
||||
case M.$and:
|
||||
return opseq('true', ' && ', ... p[0].map(pp => walk(v, pp)));
|
||||
return opseq('true', ' && ', ... p[0].map(pp => predicateFor(v, pp)));
|
||||
case M.$pointer:
|
||||
return `_.isPointer(${v})`;
|
||||
case M.$rec:
|
||||
return opseq('true', ' && ',
|
||||
`_.Record.isRecord<_val, _.Tuple<_val>, _ptr>(${v})`,
|
||||
walk(`${v}.label`, p[0]),
|
||||
walk(v, p[1], true));
|
||||
predicateFor(`${v}.label`, p[0]),
|
||||
predicateFor(v, p[1], true));
|
||||
case M.$tuple:
|
||||
return opseq('true', ' && ',
|
||||
... (recordOkAsTuple ? []
|
||||
: [`_.Array.isArray(${v})`, `!_.Record.isRecord<_val, _.Tuple<_val>, _ptr>(${v})`]),
|
||||
`(${v}.length === ${p[0].length})`,
|
||||
... p[0].map((pp, i) => walk(`${v}[${i}]`, unname(pp))));
|
||||
... p[0].map((pp, i) => predicateFor(`${v}[${i}]`, unname(pp))));
|
||||
case M.$tuple_STAR_:
|
||||
return opseq('true', ' && ',
|
||||
... (recordOkAsTuple ? []
|
||||
|
@ -147,23 +147,23 @@ export function compile(env: Environment, schema: Schema, options: CompilerOptio
|
|||
`(${v}.length >= ${p[0].length})`,
|
||||
seq(`${v}.slice(${p[0].length})`,
|
||||
`.every(v => `,
|
||||
parens(walk('v', unname(p[1]))),
|
||||
parens(predicateFor('v', unname(p[1]))),
|
||||
`)`),
|
||||
... p[0].map((pp, i) => walk(`${v}[${i}]`, unname(pp))));
|
||||
... p[0].map((pp, i) => predicateFor(`${v}[${i}]`, unname(pp))));
|
||||
case M.$setof:
|
||||
return opseq('true', ' && ',
|
||||
`_.Set.isSet<_val>(${v})`,
|
||||
fnblock(
|
||||
seq(`for (const vv of ${v}) `, block(
|
||||
seq('if (!(', walk('vv', p[0]), ')) return false'))),
|
||||
seq('if (!(', predicateFor('vv', p[0]), ')) return false'))),
|
||||
seq('return true')));
|
||||
case M.$dictof:
|
||||
return opseq('true', ' && ',
|
||||
`_.Dictionary.isDictionary<_val, _ptr>(${v})`,
|
||||
fnblock(
|
||||
seq(`for (const e of ${v}) `, block(
|
||||
seq('if (!(', walk('e[0]', p[0]), ')) return false'),
|
||||
seq('if (!(', walk('e[1]', p[1]), ')) return false'))),
|
||||
seq('if (!(', predicateFor('e[0]', p[0]), ')) return false'),
|
||||
seq('if (!(', predicateFor('e[1]', p[1]), ')) return false'))),
|
||||
seq('return true')));
|
||||
case M.$dict:
|
||||
return opseq('true', ' && ',
|
||||
|
@ -172,7 +172,7 @@ export function compile(env: Environment, schema: Schema, options: CompilerOptio
|
|||
const tmp = gentemp();
|
||||
return parens(seq(
|
||||
`(${tmp} = ${v}.get(${literal(k)})) !== void 0 && `,
|
||||
walk(tmp, vp)));
|
||||
predicateFor(tmp, vp)));
|
||||
}));
|
||||
default:
|
||||
((_p: never) => {})(p);
|
||||
|
@ -195,7 +195,7 @@ export function compile(env: Environment, schema: Schema, options: CompilerOptio
|
|||
for (const [name0, pattern] of Schema._.details(schema).get(M.$definitions)) {
|
||||
const name = name0 as symbol;
|
||||
temps = [];
|
||||
const recognizer = walk('v', pattern);
|
||||
const recognizer = predicateFor('v', pattern);
|
||||
if (pattern.label === M.$rec &&
|
||||
pattern[0].label === M.$lit &&
|
||||
pattern[1].label === M.$tuple)
|
||||
|
|
Loading…
Reference in New Issue