Cosmetic: rename function, rearrange functions

This commit is contained in:
Tony Garnock-Jones 2021-03-12 11:11:00 +01:00
parent 2b9eddfc79
commit ce947c109a
1 changed files with 23 additions and 23 deletions

View File

@ -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)