From 13c9e7026b3a5ba274ef046db3311b76aaaac244 Mon Sep 17 00:00:00 2001 From: Tan Kian-ting Date: Mon, 4 Sep 2023 22:02:05 +0800 Subject: [PATCH] add matchRange --- src/index.js | 33 ++++++++++++++++++++++++++++++++- src/index.ts | 30 ++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 00c72f4..712af45 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.thenDo = exports.charToCodepoint = exports.match1Char = void 0; +exports.thenDo = exports.charToCodepoint = exports.matchRange = exports.match1Char = void 0; var fs = require('fs'); /** * @description @@ -26,6 +26,37 @@ function match1Char(c) { } exports.match1Char = match1Char; ; +/** + * @description + * it returns a function which test if the first char of the `remained` part of + * the argument of the function is between `l` and `u`, if it's true, update the `MatchedPair` wrapped + * in `Some`. Otherwise, it returns `None`. + * * @param l : lower bound char, 1-char string + * * @param u : upper bound char, 1-char string + * @returns the updated `MatchedPair` wrapped in `Some(x)` or `None`. + */ +function matchRange(l, u) { + let lCodepoint = charToCodepoint(l); + let uCodepoint = charToCodepoint(u); + if (l > u) { + throw new Error("Error: the codepoint of `" + l + "` is not smaller than `" + u + "`)"); + } + return (m) => { + const charToBeMatched = m.remained[0]; + const codePointToBeMatched = charToCodepoint(charToBeMatched); + if (codePointToBeMatched >= lCodepoint && codePointToBeMatched <= uCodepoint) { + return { _tag: "Some", value: { + matched: m.matched + charToBeMatched, + remained: m.remained.substring(1) + } }; + } + else { + return { _tag: "None" }; + } + }; +} +exports.matchRange = matchRange; +; /** * convert the one-char string to codepoint. * @param s : the string to code point. diff --git a/src/index.ts b/src/index.ts index 3c3384d..26cd10d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -45,6 +45,36 @@ export function match1Char(c : string) : (m: MatcheePair) => Maybe } }; +/** + * @description + * it returns a function which test if the first char of the `remained` part of + * the argument of the function is between `l` and `u`, if it's true, update the `MatchedPair` wrapped + * in `Some`. Otherwise, it returns `None`. + * * @param l : lower bound char, 1-char string + * * @param u : upper bound char, 1-char string + * @returns the updated `MatchedPair` wrapped in `Some(x)` or `None`. + */ +export function matchRange(l : string, u : string) : (m: MatcheePair) => Maybe { + let lCodepoint = charToCodepoint(l); + let uCodepoint = charToCodepoint(u); + if (l > u){ + throw new Error("Error: the codepoint of `"+l+"` is not smaller than `"+u+"`)"); + } + return (m : MatcheePair)=>{ + + const charToBeMatched = m.remained[0]; + const codePointToBeMatched = charToCodepoint(charToBeMatched); + if (codePointToBeMatched >= lCodepoint && codePointToBeMatched <= uCodepoint){ + return {_tag: "Some", value :{ + matched : m.matched + charToBeMatched, + remained : m.remained.substring(1)}}; + } + else{ + return {_tag: "None"}; + } + } +}; + /** * convert the one-char string to codepoint. * @param s : the string to code point. -- 2.39.2