Support selection of a particular variant in quasipatterns
This commit is contained in:
parent
9d54abe6f5
commit
7668dbb401
|
@ -211,11 +211,7 @@ export function ctor(info: QuasiValueConstructorInfo, ... items: QuasiValue[]):
|
|||
}
|
||||
}
|
||||
|
||||
switch (def._variant) {
|
||||
case 'or': throw new Error("Cannot use union definition as pattern");
|
||||
case 'and': throw new Error("Cannot use intersection definition as pattern");
|
||||
case 'Pattern': {
|
||||
const p = def.value;
|
||||
function qTopPattern(p: Meta.Pattern): QuasiValue {
|
||||
switch (p._variant) {
|
||||
case 'SimplePattern': {
|
||||
if (ctorArgs.length === 0) {
|
||||
|
@ -227,6 +223,24 @@ export function ctor(info: QuasiValueConstructorInfo, ... items: QuasiValue[]):
|
|||
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) {
|
||||
return info.quasiValue(... items);
|
||||
|
|
Loading…
Reference in New Issue