@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/src/tree.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ICirruNode } from "./types";
|
|
1
|
+
import type { ICirruNode } from "./types";
|
|
2
2
|
|
|
3
3
|
export let pushToList = <T>(acc: T[], xs: T[], ys?: T[], zs?: T[]) => {
|
|
4
4
|
let result = acc;
|
|
@@ -26,18 +26,16 @@ export let isNumber = (x: any) => typeof x === "number";
|
|
|
26
26
|
export let isOdd = (x: number) => x % 2 === 1;
|
|
27
27
|
|
|
28
28
|
export let resolveComma = (xs: ICirruNode[]) => {
|
|
29
|
-
if (
|
|
29
|
+
if (xs.length === 0) {
|
|
30
30
|
return [];
|
|
31
31
|
} else {
|
|
32
|
-
return commaHelper(xs);
|
|
32
|
+
return commaHelper(xs, 0);
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
35
|
|
|
36
|
-
let commaHelper = (
|
|
36
|
+
let commaHelper = (after: ICirruNode[], start: number): ICirruNode[] => {
|
|
37
37
|
let before: ICirruNode[] = [];
|
|
38
|
-
let
|
|
39
|
-
|
|
40
|
-
let pointer = 0;
|
|
38
|
+
let pointer = start;
|
|
41
39
|
|
|
42
40
|
while (true) {
|
|
43
41
|
if (pointer >= after.length) {
|
|
@@ -45,16 +43,18 @@ let commaHelper = (intialAfter: ICirruNode[]) => {
|
|
|
45
43
|
}
|
|
46
44
|
let cursor = after[pointer];
|
|
47
45
|
|
|
48
|
-
if (isArray(cursor) &&
|
|
46
|
+
if (isArray(cursor) && cursor.length > 0) {
|
|
49
47
|
let head = cursor[0];
|
|
50
48
|
if (isArray(head)) {
|
|
51
|
-
before.push(
|
|
49
|
+
before.push(commaHelper(cursor, 0));
|
|
52
50
|
pointer += 1;
|
|
53
51
|
} else if (head === ",") {
|
|
54
|
-
|
|
52
|
+
// spread comma-expanded tail into before without a slice allocation
|
|
53
|
+
const expanded = commaHelper(cursor, 1);
|
|
54
|
+
for (let i = 0; i < expanded.length; i++) before.push(expanded[i]);
|
|
55
55
|
pointer += 1;
|
|
56
56
|
} else {
|
|
57
|
-
before.push(
|
|
57
|
+
before.push(commaHelper(cursor, 0));
|
|
58
58
|
pointer += 1;
|
|
59
59
|
}
|
|
60
60
|
} else {
|
|
@@ -65,35 +65,75 @@ let commaHelper = (intialAfter: ICirruNode[]) => {
|
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
export let resolveDollar = (xs: ICirruNode[]) => {
|
|
68
|
-
if (
|
|
68
|
+
if (xs.length === 0) {
|
|
69
69
|
return [];
|
|
70
70
|
} else {
|
|
71
|
-
return dollarHelper(xs);
|
|
71
|
+
return dollarHelper(xs, 0);
|
|
72
72
|
}
|
|
73
73
|
};
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
// Combined pass intended to be equivalent to `resolveComma(resolveDollar(xs))`.
|
|
76
|
+
// Correctness matters more than speed here, so keep the logic structurally close
|
|
77
|
+
// to the existing two helpers and validate with explicit edge-case tests.
|
|
78
|
+
export let resolveDollarComma = (xs: ICirruNode[]) => {
|
|
79
|
+
if (xs.length === 0) {
|
|
80
|
+
return [];
|
|
81
|
+
} else {
|
|
82
|
+
return dollarCommaHelper(xs, 0);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
78
85
|
|
|
79
|
-
|
|
86
|
+
// Pass `start` to avoid `after.slice(pointer + 1)` allocation on every `$` token.
|
|
87
|
+
let dollarHelper = (after: ICirruNode[], start: number): ICirruNode[] => {
|
|
88
|
+
let before: ICirruNode[] = [];
|
|
89
|
+
let pointer = start;
|
|
80
90
|
|
|
81
91
|
while (true) {
|
|
82
92
|
if (pointer >= after.length) {
|
|
83
93
|
return before;
|
|
94
|
+
}
|
|
95
|
+
let cursor = after[pointer];
|
|
96
|
+
|
|
97
|
+
if (isArray(cursor)) {
|
|
98
|
+
before.push(dollarHelper(cursor, 0));
|
|
99
|
+
pointer += 1;
|
|
100
|
+
} else if (cursor === "$") {
|
|
101
|
+
before.push(dollarHelper(after, pointer + 1)); // no slice needed — pass bounds
|
|
102
|
+
break;
|
|
84
103
|
} else {
|
|
85
|
-
|
|
104
|
+
before.push(cursor);
|
|
105
|
+
pointer += 1;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return before;
|
|
109
|
+
};
|
|
86
110
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
111
|
+
let dollarCommaHelper = (after: ICirruNode[], start: number): ICirruNode[] => {
|
|
112
|
+
let before: ICirruNode[] = [];
|
|
113
|
+
let pointer = start;
|
|
114
|
+
|
|
115
|
+
while (true) {
|
|
116
|
+
if (pointer >= after.length) {
|
|
117
|
+
return before;
|
|
118
|
+
}
|
|
119
|
+
let cursor = after[pointer];
|
|
120
|
+
|
|
121
|
+
if (isArray(cursor)) {
|
|
122
|
+
const child = dollarCommaHelper(cursor, 0);
|
|
123
|
+
if (child.length > 0 && child[0] === ",") {
|
|
124
|
+
for (let i = 1; i < child.length; i++) before.push(child[i]);
|
|
93
125
|
} else {
|
|
94
|
-
before.push(
|
|
95
|
-
pointer += 1;
|
|
126
|
+
before.push(child);
|
|
96
127
|
}
|
|
128
|
+
pointer += 1;
|
|
129
|
+
} else if (cursor === "$") {
|
|
130
|
+
before.push(dollarCommaHelper(after, pointer + 1));
|
|
131
|
+
break;
|
|
132
|
+
} else {
|
|
133
|
+
before.push(cursor);
|
|
134
|
+
pointer += 1;
|
|
97
135
|
}
|
|
98
136
|
}
|
|
137
|
+
|
|
138
|
+
return before;
|
|
99
139
|
};
|
package/tsconfig-compile.json
CHANGED