@cirru/parser.ts 0.0.7 → 0.0.9

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/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 ((0, exports.isEmpty)(xs)) {
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 = (intialAfter) => {
42
+ let commaHelper = (after, start) => {
43
43
  let before = [];
44
- let after = intialAfter;
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) && (0, exports.notEmpty)(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((0, exports.resolveComma)(cursor));
53
+ before.push(commaHelper(cursor, 0));
55
54
  pointer += 1;
56
55
  }
57
56
  else if (head === ",") {
58
- (0, exports.pushToList)(before, (0, exports.resolveComma)(cursor.slice(1)));
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((0, exports.resolveComma)(cursor));
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 ((0, exports.isEmpty)(xs)) {
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
- let dollarHelper = (initialAfter) => {
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 after = initialAfter;
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
- let cursor = after[pointer];
91
- if ((0, exports.isArray)(cursor)) {
92
- before.push((0, exports.resolveDollar)(cursor));
93
- pointer += 1;
94
- }
95
- else if (cursor === "$") {
96
- before.push((0, exports.resolveDollar)(after.slice(pointer + 1))); // pick items after pointer for $
97
- pointer = after.length; // trying to exit
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(cursor);
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":"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"}
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@cirru/parser.ts",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "description": "Cirru Parser in TypeScript",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
7
- "release": "rm -rfv dist/* && time vite build --base=./",
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
- "compile": "rm -rfv lib/* && tsc -d --project tsconfig-compile.json --outDir lib/",
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
- "upload": "rsync -avr --progress dist/ cirru.org:~/repo/Cirru/parser.ts",
14
- "postinstall": "rm -rfv node_modules/@types/*/node_modules/@types/react"
14
+ "upload": "rsync -avr --progress dist/ cirru.org:~/repo/Cirru/parser.ts"
15
15
  },
16
16
  "keywords": [],
17
17
  "author": "",
@@ -27,7 +27,7 @@
27
27
  "devDependencies": {
28
28
  "@emotion/css": "^11.11.2",
29
29
  "@types/jest": "^29.5.3",
30
- "@types/node": "^20.4.6",
30
+ "@types/node": "^25.4.0",
31
31
  "@types/react": "^18.2.18",
32
32
  "@types/react-dom": "^18.2.7",
33
33
  "dayjs": "^1.11.9",
@@ -38,7 +38,7 @@
38
38
  "ts-jest": "^29.1.1",
39
39
  "typescript": "^5.1.6",
40
40
  "typescript-styled-plugin": "^0.18.3",
41
- "vite": "^4.4.8"
41
+ "vite": "^8.0.0-beta.18"
42
42
  },
43
- "dependencies": {}
43
+ "packageManager": "yarn@4.13.0"
44
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
+ });