]> git.kianting.info Git - uann/commitdiff
add matchRange
authorTan Kian-ting <chenjt30@gmail.com>
Mon, 4 Sep 2023 14:02:05 +0000 (22:02 +0800)
committerTan Kian-ting <chenjt30@gmail.com>
Mon, 4 Sep 2023 14:02:05 +0000 (22:02 +0800)
src/index.js
src/index.ts

index 00c72f49471b506f9f0f540322eb770a8a208e8d..712af45015c8dbd4747f9df53f1506724ca8effd 100644 (file)
@@ -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.
index 3c3384d520bc8bf8d6e54bd6f00bbf47cf909ee2..26cd10df0e081ec2ce445b72c26aeef17bdde0bb 100644 (file)
@@ -45,6 +45,36 @@ export function match1Char(c : string) : (m: MatcheePair) => Maybe<MatcheePair>
     }
 };
 
+/**
+ * @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<MatcheePair> {
+    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.