@cirru/parser.ts 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +1 -0
- package/Agents.md +198 -0
- package/lib/index.js +270 -281
- package/lib/index.js.map +1 -1
- package/lib/tree.d.ts +2 -1
- package/lib/tree.js +68 -25
- package/lib/tree.js.map +1 -1
- package/package.json +7 -6
- package/src/bench.ts +45 -0
- package/src/index.ts +266 -277
- package/src/parser.test.ts +54 -0
- package/src/tree.ts +66 -26
- package/tsconfig-compile.json +1 -1
- package/tsconfig.bench.json +11 -0
package/lib/tree.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ICirruNode } from "./types";
|
|
1
|
+
import type { ICirruNode } from "./types";
|
|
2
2
|
export declare let pushToList: <T>(acc: T[], xs: T[], ys?: T[], zs?: T[]) => T[];
|
|
3
3
|
export declare let isArray: (arg: any) => arg is any[];
|
|
4
4
|
export declare let isEmpty: (xs: any[] | string) => boolean;
|
|
@@ -8,3 +8,4 @@ export declare let isNumber: (x: any) => boolean;
|
|
|
8
8
|
export declare let isOdd: (x: number) => boolean;
|
|
9
9
|
export declare let resolveComma: (xs: ICirruNode[]) => ICirruNode[];
|
|
10
10
|
export declare let resolveDollar: (xs: ICirruNode[]) => ICirruNode[];
|
|
11
|
+
export declare let resolveDollarComma: (xs: ICirruNode[]) => ICirruNode[];
|
package/lib/tree.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.resolveDollar = exports.resolveComma = exports.isOdd = exports.isNumber = exports.isString = exports.notEmpty = exports.isEmpty = exports.isArray = exports.pushToList = void 0;
|
|
3
|
+
exports.resolveDollarComma = exports.resolveDollar = exports.resolveComma = exports.isOdd = exports.isNumber = exports.isString = exports.notEmpty = exports.isEmpty = exports.isArray = exports.pushToList = void 0;
|
|
4
4
|
let pushToList = (acc, xs, ys, zs) => {
|
|
5
5
|
let result = acc;
|
|
6
6
|
xs.forEach((x) => {
|
|
@@ -31,35 +31,37 @@ exports.isNumber = isNumber;
|
|
|
31
31
|
let isOdd = (x) => x % 2 === 1;
|
|
32
32
|
exports.isOdd = isOdd;
|
|
33
33
|
let resolveComma = (xs) => {
|
|
34
|
-
if (
|
|
34
|
+
if (xs.length === 0) {
|
|
35
35
|
return [];
|
|
36
36
|
}
|
|
37
37
|
else {
|
|
38
|
-
return commaHelper(xs);
|
|
38
|
+
return commaHelper(xs, 0);
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
41
|
exports.resolveComma = resolveComma;
|
|
42
|
-
let commaHelper = (
|
|
42
|
+
let commaHelper = (after, start) => {
|
|
43
43
|
let before = [];
|
|
44
|
-
let
|
|
45
|
-
let pointer = 0;
|
|
44
|
+
let pointer = start;
|
|
46
45
|
while (true) {
|
|
47
46
|
if (pointer >= after.length) {
|
|
48
47
|
return before;
|
|
49
48
|
}
|
|
50
49
|
let cursor = after[pointer];
|
|
51
|
-
if ((0, exports.isArray)(cursor) &&
|
|
50
|
+
if ((0, exports.isArray)(cursor) && cursor.length > 0) {
|
|
52
51
|
let head = cursor[0];
|
|
53
52
|
if ((0, exports.isArray)(head)) {
|
|
54
|
-
before.push((
|
|
53
|
+
before.push(commaHelper(cursor, 0));
|
|
55
54
|
pointer += 1;
|
|
56
55
|
}
|
|
57
56
|
else if (head === ",") {
|
|
58
|
-
|
|
57
|
+
// spread comma-expanded tail into before without a slice allocation
|
|
58
|
+
const expanded = commaHelper(cursor, 1);
|
|
59
|
+
for (let i = 0; i < expanded.length; i++)
|
|
60
|
+
before.push(expanded[i]);
|
|
59
61
|
pointer += 1;
|
|
60
62
|
}
|
|
61
63
|
else {
|
|
62
|
-
before.push((
|
|
64
|
+
before.push(commaHelper(cursor, 0));
|
|
63
65
|
pointer += 1;
|
|
64
66
|
}
|
|
65
67
|
}
|
|
@@ -70,37 +72,78 @@ let commaHelper = (intialAfter) => {
|
|
|
70
72
|
}
|
|
71
73
|
};
|
|
72
74
|
let resolveDollar = (xs) => {
|
|
73
|
-
if (
|
|
75
|
+
if (xs.length === 0) {
|
|
74
76
|
return [];
|
|
75
77
|
}
|
|
76
78
|
else {
|
|
77
|
-
return dollarHelper(xs);
|
|
79
|
+
return dollarHelper(xs, 0);
|
|
78
80
|
}
|
|
79
81
|
};
|
|
80
82
|
exports.resolveDollar = resolveDollar;
|
|
81
|
-
|
|
83
|
+
// Combined pass intended to be equivalent to `resolveComma(resolveDollar(xs))`.
|
|
84
|
+
// Correctness matters more than speed here, so keep the logic structurally close
|
|
85
|
+
// to the existing two helpers and validate with explicit edge-case tests.
|
|
86
|
+
let resolveDollarComma = (xs) => {
|
|
87
|
+
if (xs.length === 0) {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
return dollarCommaHelper(xs, 0);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
exports.resolveDollarComma = resolveDollarComma;
|
|
95
|
+
// Pass `start` to avoid `after.slice(pointer + 1)` allocation on every `$` token.
|
|
96
|
+
let dollarHelper = (after, start) => {
|
|
82
97
|
let before = [];
|
|
83
|
-
let
|
|
84
|
-
let pointer = 0;
|
|
98
|
+
let pointer = start;
|
|
85
99
|
while (true) {
|
|
86
100
|
if (pointer >= after.length) {
|
|
87
101
|
return before;
|
|
88
102
|
}
|
|
103
|
+
let cursor = after[pointer];
|
|
104
|
+
if ((0, exports.isArray)(cursor)) {
|
|
105
|
+
before.push(dollarHelper(cursor, 0));
|
|
106
|
+
pointer += 1;
|
|
107
|
+
}
|
|
108
|
+
else if (cursor === "$") {
|
|
109
|
+
before.push(dollarHelper(after, pointer + 1)); // no slice needed — pass bounds
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
89
112
|
else {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
113
|
+
before.push(cursor);
|
|
114
|
+
pointer += 1;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return before;
|
|
118
|
+
};
|
|
119
|
+
let dollarCommaHelper = (after, start) => {
|
|
120
|
+
let before = [];
|
|
121
|
+
let pointer = start;
|
|
122
|
+
while (true) {
|
|
123
|
+
if (pointer >= after.length) {
|
|
124
|
+
return before;
|
|
125
|
+
}
|
|
126
|
+
let cursor = after[pointer];
|
|
127
|
+
if ((0, exports.isArray)(cursor)) {
|
|
128
|
+
const child = dollarCommaHelper(cursor, 0);
|
|
129
|
+
if (child.length > 0 && child[0] === ",") {
|
|
130
|
+
for (let i = 1; i < child.length; i++)
|
|
131
|
+
before.push(child[i]);
|
|
98
132
|
}
|
|
99
133
|
else {
|
|
100
|
-
before.push(
|
|
101
|
-
pointer += 1;
|
|
134
|
+
before.push(child);
|
|
102
135
|
}
|
|
136
|
+
pointer += 1;
|
|
137
|
+
}
|
|
138
|
+
else if (cursor === "$") {
|
|
139
|
+
before.push(dollarCommaHelper(after, pointer + 1));
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
before.push(cursor);
|
|
144
|
+
pointer += 1;
|
|
103
145
|
}
|
|
104
146
|
}
|
|
147
|
+
return before;
|
|
105
148
|
};
|
|
106
149
|
//# sourceMappingURL=tree.js.map
|
package/lib/tree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":";;;AAEO,IAAI,UAAU,GAAG,CAAI,GAAQ,EAAE,EAAO,EAAE,EAAQ,EAAE,EAAQ,EAAE,EAAE;IACnE,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,IAAI,EAAE,IAAI,IAAI,EAAE;QACd,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;KACJ;IACD,IAAI,EAAE,IAAI,IAAI,EAAE;QACd,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;KACJ;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAhBS,QAAA,UAAU,cAgBnB;AAES,QAAA,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;AAC5B,IAAI,OAAO,GAAG,CAAC,EAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;AAAlD,QAAA,OAAO,WAA2C;AACtD,IAAI,QAAQ,GAAG,CAAC,EAAS,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAAxC,QAAA,QAAQ,YAAgC;AAC5C,IAAI,QAAQ,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;AAA7C,QAAA,QAAQ,YAAqC;AACjD,IAAI,QAAQ,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;AAA7C,QAAA,QAAQ,YAAqC;AACjD,IAAI,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAnC,QAAA,KAAK,SAA8B;AAEvC,IAAI,YAAY,GAAG,CAAC,EAAgB,EAAE,EAAE;IAC7C,IAAI,
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":";;;AAEO,IAAI,UAAU,GAAG,CAAI,GAAQ,EAAE,EAAO,EAAE,EAAQ,EAAE,EAAQ,EAAE,EAAE;IACnE,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,IAAI,EAAE,IAAI,IAAI,EAAE;QACd,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;KACJ;IACD,IAAI,EAAE,IAAI,IAAI,EAAE;QACd,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;KACJ;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAhBS,QAAA,UAAU,cAgBnB;AAES,QAAA,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;AAC5B,IAAI,OAAO,GAAG,CAAC,EAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;AAAlD,QAAA,OAAO,WAA2C;AACtD,IAAI,QAAQ,GAAG,CAAC,EAAS,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAAxC,QAAA,QAAQ,YAAgC;AAC5C,IAAI,QAAQ,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;AAA7C,QAAA,QAAQ,YAAqC;AACjD,IAAI,QAAQ,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;AAA7C,QAAA,QAAQ,YAAqC;AACjD,IAAI,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAnC,QAAA,KAAK,SAA8B;AAEvC,IAAI,YAAY,GAAG,CAAC,EAAgB,EAAE,EAAE;IAC7C,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;QACnB,OAAO,EAAE,CAAC;KACX;SAAM;QACL,OAAO,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;KAC3B;AACH,CAAC,CAAC;AANS,QAAA,YAAY,gBAMrB;AAEF,IAAI,WAAW,GAAG,CAAC,KAAmB,EAAE,KAAa,EAAgB,EAAE;IACrE,IAAI,MAAM,GAAiB,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO,IAAI,EAAE;QACX,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;YAC3B,OAAO,MAAM,CAAC;SACf;QACD,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5B,IAAI,IAAA,eAAO,EAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACxC,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,IAAA,eAAO,EAAC,IAAI,CAAC,EAAE;gBACjB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpC,OAAO,IAAI,CAAC,CAAC;aACd;iBAAM,IAAI,IAAI,KAAK,GAAG,EAAE;gBACvB,oEAAoE;gBACpE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE;oBAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnE,OAAO,IAAI,CAAC,CAAC;aACd;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpC,OAAO,IAAI,CAAC,CAAC;aACd;SACF;aAAM;YACL,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC,CAAC;SACd;KACF;AACH,CAAC,CAAC;AAEK,IAAI,aAAa,GAAG,CAAC,EAAgB,EAAE,EAAE;IAC9C,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;QACnB,OAAO,EAAE,CAAC;KACX;SAAM;QACL,OAAO,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;KAC5B;AACH,CAAC,CAAC;AANS,QAAA,aAAa,iBAMtB;AAEF,gFAAgF;AAChF,iFAAiF;AACjF,0EAA0E;AACnE,IAAI,kBAAkB,GAAG,CAAC,EAAgB,EAAE,EAAE;IACnD,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;QACnB,OAAO,EAAE,CAAC;KACX;SAAM;QACL,OAAO,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;KACjC;AACH,CAAC,CAAC;AANS,QAAA,kBAAkB,sBAM3B;AAEF,kFAAkF;AAClF,IAAI,YAAY,GAAG,CAAC,KAAmB,EAAE,KAAa,EAAgB,EAAE;IACtE,IAAI,MAAM,GAAiB,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO,IAAI,EAAE;QACX,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;YAC3B,OAAO,MAAM,CAAC;SACf;QACD,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5B,IAAI,IAAA,eAAO,EAAC,MAAM,CAAC,EAAE;YACnB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC,CAAC;SACd;aAAM,IAAI,MAAM,KAAK,GAAG,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gCAAgC;YAC/E,MAAM;SACP;aAAM;YACL,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC,CAAC;SACd;KACF;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,IAAI,iBAAiB,GAAG,CAAC,KAAmB,EAAE,KAAa,EAAgB,EAAE;IAC3E,IAAI,MAAM,GAAiB,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO,IAAI,EAAE;QACX,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;YAC3B,OAAO,MAAM,CAAC;SACf;QACD,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5B,IAAI,IAAA,eAAO,EAAC,MAAM,CAAC,EAAE;YACnB,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;gBACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aAC9D;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACpB;YACD,OAAO,IAAI,CAAC,CAAC;SACd;aAAM,IAAI,MAAM,KAAK,GAAG,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM;SACP;aAAM;YACL,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC,CAAC;SACd;KACF;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cirru/parser.ts",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10",
|
|
4
4
|
"description": "Cirru Parser in TypeScript",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"release": "rm -rfv dist
|
|
7
|
+
"release": "rm -rfv dist && time vite build --base=./",
|
|
8
8
|
"build": "yarn release",
|
|
9
9
|
"serve": "http-server dist/ -s",
|
|
10
10
|
"test": "yarn jest",
|
|
11
|
-
"
|
|
11
|
+
"bench": "tsc -p tsconfig.bench.json --outDir .bench && node .bench/bench.js && rm -rf .bench",
|
|
12
|
+
"compile": "rm -rfv lib && tsc -d --project tsconfig-compile.json --outDir lib/",
|
|
12
13
|
"prepare": "yarn test && yarn compile",
|
|
13
14
|
"upload": "rsync -avr --progress dist/ cirru.org:~/repo/Cirru/parser.ts"
|
|
14
15
|
},
|
|
@@ -26,7 +27,7 @@
|
|
|
26
27
|
"devDependencies": {
|
|
27
28
|
"@emotion/css": "^11.11.2",
|
|
28
29
|
"@types/jest": "^29.5.3",
|
|
29
|
-
"@types/node": "^
|
|
30
|
+
"@types/node": "^25.4.0",
|
|
30
31
|
"@types/react": "^18.2.18",
|
|
31
32
|
"@types/react-dom": "^18.2.7",
|
|
32
33
|
"dayjs": "^1.11.9",
|
|
@@ -37,7 +38,7 @@
|
|
|
37
38
|
"ts-jest": "^29.1.1",
|
|
38
39
|
"typescript": "^5.1.6",
|
|
39
40
|
"typescript-styled-plugin": "^0.18.3",
|
|
40
|
-
"vite": "^
|
|
41
|
+
"vite": "^8.0.0-beta.18"
|
|
41
42
|
},
|
|
42
|
-
"
|
|
43
|
+
"packageManager": "yarn@4.13.0"
|
|
43
44
|
}
|
package/src/bench.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { parse } from "./index";
|
|
4
|
+
|
|
5
|
+
let inputCode: string;
|
|
6
|
+
let inputLabel: string;
|
|
7
|
+
|
|
8
|
+
const envFile = process.env.BENCH_FILE;
|
|
9
|
+
if (envFile) {
|
|
10
|
+
// Use an externally provided file (path never committed to source)
|
|
11
|
+
inputCode = fs.readFileSync(envFile, "utf8");
|
|
12
|
+
inputLabel = path.basename(envFile);
|
|
13
|
+
} else {
|
|
14
|
+
// Fall back to bundled test fixtures
|
|
15
|
+
const testFiles = ["demo", "html", "comma", "folding", "indent", "line", "parentheses", "quote", "unfolding", "list-match"];
|
|
16
|
+
const resolveFixture = (name: string) => {
|
|
17
|
+
const candidates = [path.join(__dirname, `../test/cirru/${name}.cirru`), path.join(__dirname, `test/cirru/${name}.cirru`)];
|
|
18
|
+
for (const p of candidates) {
|
|
19
|
+
if (fs.existsSync(p)) return fs.readFileSync(p, "utf8");
|
|
20
|
+
}
|
|
21
|
+
throw new Error(`Cannot find ${name}.cirru`);
|
|
22
|
+
};
|
|
23
|
+
inputCode = Array.from({ length: 20 }, () => testFiles.map(resolveFixture).join("\n\n")).join("\n\n");
|
|
24
|
+
inputLabel = "bundled test fixtures ×20";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
console.log(`Input: ${inputLabel} (${inputCode.length.toLocaleString()} chars)`);
|
|
28
|
+
|
|
29
|
+
function bench(label: string, fn: () => void, iterations = 500) {
|
|
30
|
+
// Warmup
|
|
31
|
+
for (let i = 0; i < 50; i++) fn();
|
|
32
|
+
|
|
33
|
+
const start = process.hrtime.bigint();
|
|
34
|
+
for (let i = 0; i < iterations; i++) fn();
|
|
35
|
+
const end = process.hrtime.bigint();
|
|
36
|
+
|
|
37
|
+
const totalMs = Number(end - start) / 1_000_000;
|
|
38
|
+
const opsPerSec = Math.round((iterations / totalMs) * 1000);
|
|
39
|
+
const msPerOp = (totalMs / iterations).toFixed(3);
|
|
40
|
+
console.log(`${label}: ${opsPerSec.toLocaleString()} ops/sec (${msPerOp}ms/op, ${iterations} iters, ${totalMs.toFixed(1)}ms total)`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
bench("parse", () => {
|
|
44
|
+
parse(inputCode);
|
|
45
|
+
});
|