From: Lady Date: Thu, 8 Sep 2022 04:14:53 +0000 (-0700) Subject: Pass exec result to constraint in Matcher X-Git-Tag: 0.2.0~3 X-Git-Url: https://git.ladys.computer/Pisces/commitdiff_plain/f0ab8cc83ab12f8d8b995358e3953e96be3d5918?hp=ecf679353a1fb5fde431eca37c70515b64eb3d05 Pass exec result to constraint in Matcher --- diff --git a/string.js b/string.js index 8c858cd..28412fc 100644 --- a/string.js +++ b/string.js @@ -65,11 +65,11 @@ export const { * A name for the matcher may be provided as the second argument. * * A callable constraint on acceptable inputs may be provided as a - * third argument. If provided, it will be called with two + * third argument. If provided, it will be called with three * arguments whenever a match appears successful: first, the string - * being matched, and second, the Matcher object itself. If the - * return value of this call is falsey, then the match will be - * considered a failure. + * being matched, second, the match result, and third, the Matcher + * object itself. If the return value of this call is falsey, then + * the match will be considered a failure. * * ☡ If the provided source regular expression uses nongreedy * quantifiers, it may not match the whole string even if a match @@ -89,8 +89,9 @@ export const { // at a match matches the whole string and passes the // provided constraint (if present). regExp.lastIndex = 0; - return call(reExec, regExp, [$])?.[0] === $ && - (constraint === null || constraint($, this)); + const result = call(reExec, regExp, [$]); + return result?.[0] === $ && + (constraint === null || constraint($, result, this)); } }, ); @@ -148,6 +149,10 @@ export const { * * Matchers only match if they can match the entire value on the * first attempt. + * + * ☡ The match result returned by this method will be the same as + * that passed to the constraint function—and may have been + * modified by said function prior to being returned. */ exec($) { const regExp = this.#regExp; @@ -157,7 +162,7 @@ export const { const result = call(reExec, regExp, [string]); if ( result?.[0] === string && - (constraint === null || constraint(string, this)) + (constraint === null || constraint(string, result, this)) ) { // The entire string was matched and the constraint, if // present, returned a truthy value. diff --git a/string.test.js b/string.test.js index 52e848c..6407d94 100644 --- a/string.test.js +++ b/string.test.js @@ -95,15 +95,15 @@ describe("Matcher", () => { it("[[Call]] calls the constraint if the match succeeds", () => { const constraint = spy((_) => true); - const matcher = new Matcher(".*", undefined, constraint); - matcher.exec({ + const matcher = new Matcher("(.).*", undefined, constraint); + const result = matcher.exec({ toString() { return "etaoin"; }, }); assertSpyCalls(constraint, 1); assertSpyCall(constraint, 0, { - args: ["etaoin", matcher], + args: ["etaoin", result, matcher], self: undefined, }); }); @@ -204,13 +204,13 @@ describe("Matcher", () => { it("[[Call]] calls the constraint if the match succeeds", () => { const constraint = spy((_) => true); - const matcher = new Matcher(".*", undefined, constraint); + const matcher = new Matcher("(.).*", undefined, constraint); matcher("etaoin"); assertSpyCalls(constraint, 1); - assertSpyCall(constraint, 0, { - args: ["etaoin", matcher], - self: undefined, - }); + assertEquals(constraint.calls[0].args[0], "etaoin"); + assertEquals([...constraint.calls[0].args[1]], ["etaoin", "e"]); + assertEquals(constraint.calls[0].args[2], matcher); + assertEquals(constraint.calls[0].self, undefined); }); it("[[Call]] does not call the constraint if the match fails", () => {