-const tk = __importStar(require("./tokenize.js"));
-let b = tk.tokenize("2+2");
-/**
- * @description
- * it returns a function which test if the first char of the `remained` part of
- * the argument of the function is `c`, if it's true, update the `MatchedPair` wrapped
- * in `Some`. Otherwise, it returns `None`.
- * * @param t : the char to be test.
- * @returns the updated `MatchedPair` wrapped in `Some(x)` or `None`.
- */
-function match1token(t) {
- return (m) => {
- if (m.remained.length == 0) {
- return { _tag: "None" };
+const js_tokens_1 = __importDefault(require("js-tokens"));
+const util = __importStar(require("util"));
+/**
+ *
+ * # REPRESENTATION
+ */
+/**
+ * convert a `tkTree` AST to S-expr string
+ * @param t the `tkTree`
+ * @returns S-expr String
+ */
+function tkTreeToSExp(t) {
+ var str = "";
+ if (Array.isArray(t)) {
+ let strArray = t.map((x) => tkTreeToSExp(x));
+ str = "(" + strArray.join(" ") + ")";
+ }
+ else {
+ if (t === undefined) {
+ str = "%undefined";
+ }
+ else {
+ str = t.value;
+ }
+ }
+ return str;
+}
+exports.tkTreeToSExp = tkTreeToSExp;
+/**inspect the inner of the representation. */
+let repr = (x) => { return util.inspect(x, { depth: null }); };
+/**
+ *
+ * # PARSER UNITS
+ */
+function toSome(x) {
+ return { _tag: "Some", value: x };
+}
+/**
+ * like `m ==> f` in ocaml
+ * @param m matchee wrapped
+ * @param f matching function
+ * @returns wrapped result
+ */
+function thenDo(m, f) {
+ if (m._tag == "None") {
+ return m;
+ }
+ else {
+ var a = f(m.value);
+ if (a._tag == "Some") {
+ a.value.ast = m.value.ast.concat(a.value.ast);
+ }
+ return a;
+ }
+}
+/**
+ *
+ * @param m : the `TokenPair` to be consumed.
+ * @returns if the length of `m.remained` >= 1; consumes the matchee by 1 token
+ * and wraps it in `Some`,
+ * otherwise, returns `None`.
+ */
+function matchAny(m) {
+ if (m.remained.length >= 1) {
+ return {
+ _tag: "Some", value: {
+ matched: m.matched.concat(m.remained[0]),
+ remained: m.remained.slice(1),
+ ast: [m.remained[0]],
+ }
+ };
+ }
+ else {
+ return { _tag: "None" };
+ }
+}
+exports.matchAny = matchAny;
+/**
+ * like `f1 | f2` in regex
+ * @param f1 the first tried function
+ * @param f2 the second tried function
+ * @returns wrapped result
+ */
+function orDo(f1, f2) {
+ return (x) => {
+ let res1 = f1(x);
+ if (res1._tag == "Some") {
+ return res1;