Support selection of a particular variant in quasipatterns

This commit is contained in:
Tony Garnock-Jones 2022-04-30 14:24:07 +03:00
parent 9d54abe6f5
commit 7668dbb401
1 changed files with 27 additions and 13 deletions

View File

@ -211,23 +211,37 @@ export function ctor(info: QuasiValueConstructorInfo, ... items: QuasiValue[]):
} }
} }
switch (def._variant) { function qTopPattern(p: Meta.Pattern): QuasiValue {
case 'or': throw new Error("Cannot use union definition as pattern"); switch (p._variant) {
case 'and': throw new Error("Cannot use intersection definition as pattern"); case 'SimplePattern': {
case 'Pattern': { if (ctorArgs.length === 0) {
const p = def.value; throw new Error(`Missing argument to ${defNameStr}`);
switch (p._variant) {
case 'SimplePattern': {
if (ctorArgs.length === 0) {
throw new Error(`Missing argument to ${defNameStr}`);
}
return ctorArgs[0];
} }
case 'CompoundPattern': return ctorArgs[0];
return qCompound(p.value);
} }
case 'CompoundPattern':
return qCompound(p.value);
} }
} }
switch (def._variant) {
case 'or': {
const variant = definfo.variant?.description;
if (variant === void 0) {
throw new Error("Cannot use union definition as pattern");
}
for (const p of [def.pattern0, def.pattern1, ...def.patternN]) {
if (p.variantLabel === variant) {
return qTopPattern(p.pattern);
}
}
throw new Error(`Unknown variant ${variant} in definition ${defNameStr}`);
}
case 'and':
throw new Error("Cannot use intersection definition as pattern");
case 'Pattern':
return qTopPattern(def.value);
}
} else if ('quasiValue' in info) { } else if ('quasiValue' in info) {
return info.quasiValue(... items); return info.quasiValue(... items);
} else { } else {