Tweak matcher

This commit is contained in:
Tony Garnock-Jones 2021-02-25 11:43:38 +01:00
parent c3100f158e
commit 88bfb1373b
1 changed files with 13 additions and 5 deletions

View File

@ -176,7 +176,7 @@ export class Turn {
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
export function match(p: Pattern, v: Assertion): Bindings | null { export function match(p: Pattern, v: Assertion): Bindings | null {
const bindings: Bindings = {}; let bindings: Bindings = {};
function walk(p: Pattern, v: Assertion): boolean { function walk(p: Pattern, v: Assertion): boolean {
return fold(p, { return fold(p, {
@ -218,12 +218,20 @@ export function match(p: Pattern, v: Assertion): Bindings | null {
if ('type' in t) { if ('type' in t) {
switch (t.type) { switch (t.type) {
case 'bind': case 'bind':
bindings[t.name] = v; if (walk(t.pattern, v)) {
return walk(t.pattern, v); bindings[t.name] = v;
return true;
}
return false;
case 'discard': case 'discard':
return true; return true;
case 'not': case 'not': {
return !walk(t.pattern, v); const savedBindings = bindings;
bindings = {};
const result = !walk(t.pattern, v)
bindings = savedBindings;
return result;
}
case 'and': case 'and':
for (const p of t.patterns) { for (const p of t.patterns) {
if (!walk(p, v)) return false; if (!walk(p, v)) return false;