typesea 0.1.0
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/CHANGELOG.md +9 -0
- package/LICENSE +21 -0
- package/README.md +320 -0
- package/dist/adapters/index.d.ts +152 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +396 -0
- package/dist/aot/index.d.ts +33 -0
- package/dist/aot/index.d.ts.map +1 -0
- package/dist/aot/index.js +295 -0
- package/dist/async/index.d.ts +111 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/index.js +221 -0
- package/dist/builders/composite.d.ts +31 -0
- package/dist/builders/composite.d.ts.map +1 -0
- package/dist/builders/composite.js +165 -0
- package/dist/builders/index.d.ts +11 -0
- package/dist/builders/index.d.ts.map +1 -0
- package/dist/builders/index.js +9 -0
- package/dist/builders/modifier.d.ts +26 -0
- package/dist/builders/modifier.d.ts.map +1 -0
- package/dist/builders/modifier.js +67 -0
- package/dist/builders/object/guard.d.ts +62 -0
- package/dist/builders/object/guard.d.ts.map +1 -0
- package/dist/builders/object/guard.js +113 -0
- package/dist/builders/object/index.d.ts +7 -0
- package/dist/builders/object/index.d.ts.map +1 -0
- package/dist/builders/object/index.js +5 -0
- package/dist/builders/object/schema.d.ts +44 -0
- package/dist/builders/object/schema.d.ts.map +1 -0
- package/dist/builders/object/schema.js +257 -0
- package/dist/builders/object/types.d.ts +63 -0
- package/dist/builders/object/types.d.ts.map +1 -0
- package/dist/builders/object/types.js +5 -0
- package/dist/builders/scalar.d.ts +39 -0
- package/dist/builders/scalar.d.ts.map +1 -0
- package/dist/builders/scalar.js +63 -0
- package/dist/builders/table.d.ts +53 -0
- package/dist/builders/table.d.ts.map +1 -0
- package/dist/builders/table.js +48 -0
- package/dist/builders/types.d.ts +26 -0
- package/dist/builders/types.d.ts.map +1 -0
- package/dist/builders/types.js +5 -0
- package/dist/compile/check-composite.d.ts +34 -0
- package/dist/compile/check-composite.d.ts.map +1 -0
- package/dist/compile/check-composite.js +117 -0
- package/dist/compile/check-scalar.d.ts +24 -0
- package/dist/compile/check-scalar.d.ts.map +1 -0
- package/dist/compile/check-scalar.js +73 -0
- package/dist/compile/check.d.ts +15 -0
- package/dist/compile/check.d.ts.map +1 -0
- package/dist/compile/check.js +98 -0
- package/dist/compile/context.d.ts +35 -0
- package/dist/compile/context.d.ts.map +1 -0
- package/dist/compile/context.js +72 -0
- package/dist/compile/graph-predicate.d.ts +19 -0
- package/dist/compile/graph-predicate.d.ts.map +1 -0
- package/dist/compile/graph-predicate.js +460 -0
- package/dist/compile/guard.d.ts +41 -0
- package/dist/compile/guard.d.ts.map +1 -0
- package/dist/compile/guard.js +180 -0
- package/dist/compile/index.d.ts +8 -0
- package/dist/compile/index.d.ts.map +1 -0
- package/dist/compile/index.js +6 -0
- package/dist/compile/issue.d.ts +18 -0
- package/dist/compile/issue.d.ts.map +1 -0
- package/dist/compile/issue.js +28 -0
- package/dist/compile/names.d.ts +16 -0
- package/dist/compile/names.d.ts.map +1 -0
- package/dist/compile/names.js +82 -0
- package/dist/compile/predicate.d.ts +23 -0
- package/dist/compile/predicate.d.ts.map +1 -0
- package/dist/compile/predicate.js +317 -0
- package/dist/compile/runtime.d.ts +55 -0
- package/dist/compile/runtime.d.ts.map +1 -0
- package/dist/compile/runtime.js +63 -0
- package/dist/compile/source.d.ts +11 -0
- package/dist/compile/source.d.ts.map +1 -0
- package/dist/compile/source.js +51 -0
- package/dist/compile/types.d.ts +52 -0
- package/dist/compile/types.d.ts.map +1 -0
- package/dist/compile/types.js +5 -0
- package/dist/decoder/index.d.ts +106 -0
- package/dist/decoder/index.d.ts.map +1 -0
- package/dist/decoder/index.js +262 -0
- package/dist/evaluate/check-composite.d.ts +39 -0
- package/dist/evaluate/check-composite.d.ts.map +1 -0
- package/dist/evaluate/check-composite.js +184 -0
- package/dist/evaluate/check-scalar.d.ts +20 -0
- package/dist/evaluate/check-scalar.d.ts.map +1 -0
- package/dist/evaluate/check-scalar.js +81 -0
- package/dist/evaluate/check.d.ts +11 -0
- package/dist/evaluate/check.d.ts.map +1 -0
- package/dist/evaluate/check.js +126 -0
- package/dist/evaluate/index.d.ts +7 -0
- package/dist/evaluate/index.d.ts.map +1 -0
- package/dist/evaluate/index.js +6 -0
- package/dist/evaluate/issue.d.ts +10 -0
- package/dist/evaluate/issue.d.ts.map +1 -0
- package/dist/evaluate/issue.js +11 -0
- package/dist/evaluate/predicate.d.ts +26 -0
- package/dist/evaluate/predicate.d.ts.map +1 -0
- package/dist/evaluate/predicate.js +37 -0
- package/dist/evaluate/shared.d.ts +59 -0
- package/dist/evaluate/shared.d.ts.map +1 -0
- package/dist/evaluate/shared.js +96 -0
- package/dist/evaluate/state.d.ts +65 -0
- package/dist/evaluate/state.d.ts.map +1 -0
- package/dist/evaluate/state.js +66 -0
- package/dist/guard/base.d.ts +72 -0
- package/dist/guard/base.d.ts.map +1 -0
- package/dist/guard/base.js +136 -0
- package/dist/guard/error.d.ts +19 -0
- package/dist/guard/error.d.ts.map +1 -0
- package/dist/guard/error.js +22 -0
- package/dist/guard/index.d.ts +10 -0
- package/dist/guard/index.d.ts.map +1 -0
- package/dist/guard/index.js +8 -0
- package/dist/guard/number.d.ts +32 -0
- package/dist/guard/number.d.ts.map +1 -0
- package/dist/guard/number.js +71 -0
- package/dist/guard/props.d.ts +18 -0
- package/dist/guard/props.d.ts.map +1 -0
- package/dist/guard/props.js +35 -0
- package/dist/guard/read.d.ts +42 -0
- package/dist/guard/read.d.ts.map +1 -0
- package/dist/guard/read.js +114 -0
- package/dist/guard/registry.d.ts +15 -0
- package/dist/guard/registry.d.ts.map +1 -0
- package/dist/guard/registry.js +21 -0
- package/dist/guard/string.d.ts +36 -0
- package/dist/guard/string.d.ts.map +1 -0
- package/dist/guard/string.js +95 -0
- package/dist/guard/types.d.ts +103 -0
- package/dist/guard/types.d.ts.map +1 -0
- package/dist/guard/types.js +5 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/internal/index.d.ts +34 -0
- package/dist/internal/index.d.ts.map +1 -0
- package/dist/internal/index.js +56 -0
- package/dist/ir/builder.d.ts +173 -0
- package/dist/ir/builder.d.ts.map +1 -0
- package/dist/ir/builder.js +481 -0
- package/dist/ir/freeze.d.ts +10 -0
- package/dist/ir/freeze.d.ts.map +1 -0
- package/dist/ir/freeze.js +102 -0
- package/dist/ir/index.d.ts +9 -0
- package/dist/ir/index.d.ts.map +1 -0
- package/dist/ir/index.js +7 -0
- package/dist/ir/regexp.d.ts +6 -0
- package/dist/ir/regexp.d.ts.map +1 -0
- package/dist/ir/regexp.js +12 -0
- package/dist/ir/types.d.ts +215 -0
- package/dist/ir/types.d.ts.map +1 -0
- package/dist/ir/types.js +5 -0
- package/dist/ir/validate.d.ts +10 -0
- package/dist/ir/validate.d.ts.map +1 -0
- package/dist/ir/validate.js +271 -0
- package/dist/issue/index.d.ts +44 -0
- package/dist/issue/index.d.ts.map +1 -0
- package/dist/issue/index.js +152 -0
- package/dist/json-schema/emit-combinator.d.ts +28 -0
- package/dist/json-schema/emit-combinator.d.ts.map +1 -0
- package/dist/json-schema/emit-combinator.js +96 -0
- package/dist/json-schema/emit-composite.d.ts +28 -0
- package/dist/json-schema/emit-composite.d.ts.map +1 -0
- package/dist/json-schema/emit-composite.js +127 -0
- package/dist/json-schema/emit-scalar.d.ts +25 -0
- package/dist/json-schema/emit-scalar.d.ts.map +1 -0
- package/dist/json-schema/emit-scalar.js +104 -0
- package/dist/json-schema/emit-types.d.ts +12 -0
- package/dist/json-schema/emit-types.d.ts.map +1 -0
- package/dist/json-schema/emit-types.js +5 -0
- package/dist/json-schema/emit.d.ts +12 -0
- package/dist/json-schema/emit.d.ts.map +1 -0
- package/dist/json-schema/emit.js +62 -0
- package/dist/json-schema/freeze.d.ts +14 -0
- package/dist/json-schema/freeze.d.ts.map +1 -0
- package/dist/json-schema/freeze.js +114 -0
- package/dist/json-schema/index.d.ts +20 -0
- package/dist/json-schema/index.d.ts.map +1 -0
- package/dist/json-schema/index.js +76 -0
- package/dist/json-schema/issue.d.ts +11 -0
- package/dist/json-schema/issue.d.ts.map +1 -0
- package/dist/json-schema/issue.js +14 -0
- package/dist/json-schema/read.d.ts +29 -0
- package/dist/json-schema/read.d.ts.map +1 -0
- package/dist/json-schema/read.js +87 -0
- package/dist/json-schema/types.d.ts +106 -0
- package/dist/json-schema/types.d.ts.map +1 -0
- package/dist/json-schema/types.js +5 -0
- package/dist/kind/index.d.ts +119 -0
- package/dist/kind/index.d.ts.map +1 -0
- package/dist/kind/index.js +94 -0
- package/dist/lower/index.d.ts +7 -0
- package/dist/lower/index.d.ts.map +1 -0
- package/dist/lower/index.js +199 -0
- package/dist/message/index.d.ts +51 -0
- package/dist/message/index.d.ts.map +1 -0
- package/dist/message/index.js +269 -0
- package/dist/optimize/compact.d.ts +10 -0
- package/dist/optimize/compact.d.ts.map +1 -0
- package/dist/optimize/compact.js +60 -0
- package/dist/optimize/fold-boolean.d.ts +15 -0
- package/dist/optimize/fold-boolean.d.ts.map +1 -0
- package/dist/optimize/fold-boolean.js +75 -0
- package/dist/optimize/fold-common.d.ts +45 -0
- package/dist/optimize/fold-common.d.ts.map +1 -0
- package/dist/optimize/fold-common.js +71 -0
- package/dist/optimize/fold-scalar.d.ts +59 -0
- package/dist/optimize/fold-scalar.d.ts.map +1 -0
- package/dist/optimize/fold-scalar.js +174 -0
- package/dist/optimize/fold.d.ts +10 -0
- package/dist/optimize/fold.d.ts.map +1 -0
- package/dist/optimize/fold.js +103 -0
- package/dist/optimize/index.d.ts +10 -0
- package/dist/optimize/index.d.ts.map +1 -0
- package/dist/optimize/index.js +23 -0
- package/dist/optimize/map-node.d.ts +21 -0
- package/dist/optimize/map-node.d.ts.map +1 -0
- package/dist/optimize/map-node.js +222 -0
- package/dist/optimize/remap.d.ts +30 -0
- package/dist/optimize/remap.d.ts.map +1 -0
- package/dist/optimize/remap.js +46 -0
- package/dist/optimize/rewrite.d.ts +22 -0
- package/dist/optimize/rewrite.d.ts.map +1 -0
- package/dist/optimize/rewrite.js +34 -0
- package/dist/plan/cache.d.ts +20 -0
- package/dist/plan/cache.d.ts.map +1 -0
- package/dist/plan/cache.js +122 -0
- package/dist/plan/index.d.ts +8 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +6 -0
- package/dist/plan/predicate.d.ts +27 -0
- package/dist/plan/predicate.d.ts.map +1 -0
- package/dist/plan/predicate.js +415 -0
- package/dist/plan/schema-predicate.d.ts +15 -0
- package/dist/plan/schema-predicate.d.ts.map +1 -0
- package/dist/plan/schema-predicate.js +277 -0
- package/dist/plan/types.d.ts +18 -0
- package/dist/plan/types.d.ts.map +1 -0
- package/dist/plan/types.js +5 -0
- package/dist/result/index.d.ts +27 -0
- package/dist/result/index.d.ts.map +1 -0
- package/dist/result/index.js +20 -0
- package/dist/schema/common.d.ts +30 -0
- package/dist/schema/common.d.ts.map +1 -0
- package/dist/schema/common.js +102 -0
- package/dist/schema/freeze.d.ts +10 -0
- package/dist/schema/freeze.d.ts.map +1 -0
- package/dist/schema/freeze.js +163 -0
- package/dist/schema/index.d.ts +11 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +9 -0
- package/dist/schema/lazy.d.ts +10 -0
- package/dist/schema/lazy.d.ts.map +1 -0
- package/dist/schema/lazy.js +25 -0
- package/dist/schema/literal.d.ts +10 -0
- package/dist/schema/literal.d.ts.map +1 -0
- package/dist/schema/literal.js +17 -0
- package/dist/schema/types.d.ts +243 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +9 -0
- package/dist/schema/validate.d.ts +10 -0
- package/dist/schema/validate.d.ts.map +1 -0
- package/dist/schema/validate.js +268 -0
- package/docs/api.md +301 -0
- package/docs/engine-notes.md +153 -0
- package/docs/index.html +1242 -0
- package/package.json +68 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file fold-scalar.ts
|
|
3
|
+
* @brief Constant folding for scalar graph nodes.
|
|
4
|
+
*/
|
|
5
|
+
import { NodeTag } from "../kind/index.js";
|
|
6
|
+
import { ensureConst, isFiniteNumber, isPlainRecord, keep, readConst, replace } from "./fold-common.js";
|
|
7
|
+
/**
|
|
8
|
+
* @brief fold get prop.
|
|
9
|
+
*/
|
|
10
|
+
export function foldGetProp(node, nodes, aliases) {
|
|
11
|
+
const value = readConst(nodes, node.object);
|
|
12
|
+
if (value.found) {
|
|
13
|
+
return replace(node, ensureConst(nodes, aliases, undefined));
|
|
14
|
+
}
|
|
15
|
+
return keep(node);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* @brief fold unary.
|
|
19
|
+
*/
|
|
20
|
+
export function foldUnary(node, nodes, aliases) {
|
|
21
|
+
const value = readConst(nodes, node.value);
|
|
22
|
+
if (!value.found) {
|
|
23
|
+
return keep(node);
|
|
24
|
+
}
|
|
25
|
+
switch (node.tag) {
|
|
26
|
+
case NodeTag.IsString:
|
|
27
|
+
return replace(node, ensureConst(nodes, aliases, typeof value.value === "string"));
|
|
28
|
+
case NodeTag.IsNumber:
|
|
29
|
+
return replace(node, ensureConst(nodes, aliases, isFiniteNumber(value.value)));
|
|
30
|
+
case NodeTag.IsBoolean:
|
|
31
|
+
return replace(node, ensureConst(nodes, aliases, typeof value.value === "boolean"));
|
|
32
|
+
case NodeTag.IsObject:
|
|
33
|
+
return replace(node, ensureConst(nodes, aliases, isPlainRecord(value.value)));
|
|
34
|
+
case NodeTag.IsArray:
|
|
35
|
+
return replace(node, ensureConst(nodes, aliases, Array.isArray(value.value)));
|
|
36
|
+
case NodeTag.IsUndefined:
|
|
37
|
+
return replace(node, ensureConst(nodes, aliases, value.value === undefined));
|
|
38
|
+
case NodeTag.IsNull:
|
|
39
|
+
return replace(node, ensureConst(nodes, aliases, value.value === null));
|
|
40
|
+
case NodeTag.IsInteger:
|
|
41
|
+
return replace(node, ensureConst(nodes, aliases, Number.isInteger(value.value)));
|
|
42
|
+
case NodeTag.Not:
|
|
43
|
+
return replace(node, ensureConst(nodes, aliases, value.value !== true));
|
|
44
|
+
case NodeTag.IsBigInt:
|
|
45
|
+
return replace(node, ensureConst(nodes, aliases, typeof value.value === "bigint"));
|
|
46
|
+
case NodeTag.IsSymbol:
|
|
47
|
+
return replace(node, ensureConst(nodes, aliases, typeof value.value === "symbol"));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @brief fold equals.
|
|
52
|
+
*/
|
|
53
|
+
export function foldEquals(node, nodes, aliases) {
|
|
54
|
+
const left = readConst(nodes, node.left);
|
|
55
|
+
const right = readConst(nodes, node.right);
|
|
56
|
+
if (!left.found || !right.found) {
|
|
57
|
+
return keep(node);
|
|
58
|
+
}
|
|
59
|
+
return replace(node, ensureConst(nodes, aliases, Object.is(left.value, right.value)));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* @brief fold numeric.
|
|
63
|
+
*/
|
|
64
|
+
export function foldNumeric(node, nodes, aliases) {
|
|
65
|
+
const left = readConst(nodes, node.left);
|
|
66
|
+
const right = readConst(nodes, node.right);
|
|
67
|
+
if (!left.found || !right.found) {
|
|
68
|
+
return keep(node);
|
|
69
|
+
}
|
|
70
|
+
const valid = typeof left.value === "number" && typeof right.value === "number";
|
|
71
|
+
const result = valid && (node.tag === NodeTag.Gte
|
|
72
|
+
? left.value >= right.value
|
|
73
|
+
: left.value <= right.value);
|
|
74
|
+
return replace(node, ensureConst(nodes, aliases, result));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @brief fold string bound.
|
|
78
|
+
*/
|
|
79
|
+
export function foldStringBound(node, nodes, aliases) {
|
|
80
|
+
const value = readConst(nodes, node.value);
|
|
81
|
+
if (!value.found) {
|
|
82
|
+
return keep(node);
|
|
83
|
+
}
|
|
84
|
+
const result = typeof value.value === "string" && (node.tag === NodeTag.StringMin
|
|
85
|
+
? value.value.length >= node.bound
|
|
86
|
+
: value.value.length <= node.bound);
|
|
87
|
+
return replace(node, ensureConst(nodes, aliases, result));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* @brief fold regex.
|
|
91
|
+
*/
|
|
92
|
+
export function foldRegex(node, nodes, aliases) {
|
|
93
|
+
const value = readConst(nodes, node.value);
|
|
94
|
+
if (!value.found) {
|
|
95
|
+
return keep(node);
|
|
96
|
+
}
|
|
97
|
+
if (typeof value.value !== "string") {
|
|
98
|
+
return replace(node, ensureConst(nodes, aliases, false));
|
|
99
|
+
}
|
|
100
|
+
node.regex.lastIndex = 0;
|
|
101
|
+
const result = node.regex.test(value.value);
|
|
102
|
+
node.regex.lastIndex = 0;
|
|
103
|
+
return replace(node, ensureConst(nodes, aliases, result));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* @brief fold has own.
|
|
107
|
+
*/
|
|
108
|
+
export function foldHasOwn(node, nodes, aliases) {
|
|
109
|
+
const value = readConst(nodes, node.object);
|
|
110
|
+
if (value.found) {
|
|
111
|
+
return replace(node, ensureConst(nodes, aliases, false));
|
|
112
|
+
}
|
|
113
|
+
return keep(node);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* @brief fold has own data.
|
|
117
|
+
*/
|
|
118
|
+
export function foldHasOwnData(node, nodes, aliases) {
|
|
119
|
+
const value = readConst(nodes, node.object);
|
|
120
|
+
if (value.found) {
|
|
121
|
+
return replace(node, ensureConst(nodes, aliases, false));
|
|
122
|
+
}
|
|
123
|
+
return keep(node);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* @brief fold strict keys.
|
|
127
|
+
*/
|
|
128
|
+
export function foldStrictKeys(node, nodes, aliases) {
|
|
129
|
+
const value = readConst(nodes, node.object);
|
|
130
|
+
if (value.found) {
|
|
131
|
+
return replace(node, ensureConst(nodes, aliases, false));
|
|
132
|
+
}
|
|
133
|
+
return keep(node);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* @brief fold array every.
|
|
137
|
+
*/
|
|
138
|
+
export function foldArrayEvery(node, nodes, aliases) {
|
|
139
|
+
const value = readConst(nodes, node.value);
|
|
140
|
+
if (value.found) {
|
|
141
|
+
return replace(node, ensureConst(nodes, aliases, false));
|
|
142
|
+
}
|
|
143
|
+
return keep(node);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* @brief fold tuple items.
|
|
147
|
+
*/
|
|
148
|
+
export function foldTupleItems(node, nodes, aliases) {
|
|
149
|
+
const value = readConst(nodes, node.value);
|
|
150
|
+
if (value.found) {
|
|
151
|
+
return replace(node, ensureConst(nodes, aliases, false));
|
|
152
|
+
}
|
|
153
|
+
return keep(node);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* @brief fold record every.
|
|
157
|
+
*/
|
|
158
|
+
export function foldRecordEvery(node, nodes, aliases) {
|
|
159
|
+
const value = readConst(nodes, node.value);
|
|
160
|
+
if (value.found) {
|
|
161
|
+
return replace(node, ensureConst(nodes, aliases, false));
|
|
162
|
+
}
|
|
163
|
+
return keep(node);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* @brief fold discriminant dispatch.
|
|
167
|
+
*/
|
|
168
|
+
export function foldDiscriminantDispatch(node, nodes, aliases) {
|
|
169
|
+
const value = readConst(nodes, node.value);
|
|
170
|
+
if (value.found) {
|
|
171
|
+
return replace(node, ensureConst(nodes, aliases, false));
|
|
172
|
+
}
|
|
173
|
+
return keep(node);
|
|
174
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.d.ts","sourceRoot":"","sources":["../../src/optimize/fold.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,KAAK,EAGN,MAAM,gBAAgB,CAAC;AAoBxB;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAsCjD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file fold.ts
|
|
3
|
+
* @brief Constant folding pass driver.
|
|
4
|
+
*/
|
|
5
|
+
import { NodeTag } from "../kind/index.js";
|
|
6
|
+
import { foldAnd, foldOr } from "./fold-boolean.js";
|
|
7
|
+
import { keep } from "./fold-common.js";
|
|
8
|
+
import { foldArrayEvery, foldDiscriminantDispatch, foldEquals, foldGetProp, foldHasOwn, foldHasOwnData, foldNumeric, foldRecordEvery, foldRegex, foldStrictKeys, foldStringBound, foldTupleItems, foldUnary } from "./fold-scalar.js";
|
|
9
|
+
import { resolveAlias, rewriteNodeDeps } from "./rewrite.js";
|
|
10
|
+
/**
|
|
11
|
+
* @brief fold constants.
|
|
12
|
+
*/
|
|
13
|
+
export function foldConstants(graph) {
|
|
14
|
+
const originalLength = graph.nodes.length;
|
|
15
|
+
const nodes = graph.nodes.slice();
|
|
16
|
+
const aliases = new Array(nodes.length);
|
|
17
|
+
for (let index = 0; index < aliases.length; index += 1) {
|
|
18
|
+
aliases[index] = index;
|
|
19
|
+
}
|
|
20
|
+
for (let index = 0; index < originalLength; index += 1) {
|
|
21
|
+
const node = nodes[index];
|
|
22
|
+
if (node === undefined) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const rewritten = rewriteNodeDeps(node, aliases);
|
|
26
|
+
const folded = foldNode(rewritten, nodes, aliases);
|
|
27
|
+
nodes[index] = folded.node;
|
|
28
|
+
if (folded.replacement !== undefined) {
|
|
29
|
+
aliases[index] = folded.replacement;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
for (let index = 0; index < aliases.length; index += 1) {
|
|
33
|
+
aliases[index] = resolveAlias(index, aliases);
|
|
34
|
+
}
|
|
35
|
+
const rewritten = new Array(nodes.length);
|
|
36
|
+
for (let index = 0; index < nodes.length; index += 1) {
|
|
37
|
+
const node = nodes[index];
|
|
38
|
+
if (node !== undefined) {
|
|
39
|
+
rewritten[index] = rewriteNodeDeps(node, aliases);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
nodes: rewritten,
|
|
44
|
+
entry: resolveAlias(graph.entry, aliases),
|
|
45
|
+
result: resolveAlias(graph.result, aliases)
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* @brief fold node.
|
|
50
|
+
*/
|
|
51
|
+
function foldNode(node, nodes, aliases) {
|
|
52
|
+
switch (node.tag) {
|
|
53
|
+
case NodeTag.Start:
|
|
54
|
+
case NodeTag.Param:
|
|
55
|
+
case NodeTag.Const:
|
|
56
|
+
case NodeTag.Return:
|
|
57
|
+
return keep(node);
|
|
58
|
+
case NodeTag.GetProp:
|
|
59
|
+
return foldGetProp(node, nodes, aliases);
|
|
60
|
+
case NodeTag.IsString:
|
|
61
|
+
case NodeTag.IsNumber:
|
|
62
|
+
case NodeTag.IsBoolean:
|
|
63
|
+
case NodeTag.IsObject:
|
|
64
|
+
case NodeTag.IsArray:
|
|
65
|
+
case NodeTag.IsUndefined:
|
|
66
|
+
case NodeTag.IsNull:
|
|
67
|
+
case NodeTag.IsInteger:
|
|
68
|
+
case NodeTag.Not:
|
|
69
|
+
case NodeTag.IsBigInt:
|
|
70
|
+
case NodeTag.IsSymbol:
|
|
71
|
+
return foldUnary(node, nodes, aliases);
|
|
72
|
+
case NodeTag.Equals:
|
|
73
|
+
return foldEquals(node, nodes, aliases);
|
|
74
|
+
case NodeTag.Gte:
|
|
75
|
+
case NodeTag.Lte:
|
|
76
|
+
return foldNumeric(node, nodes, aliases);
|
|
77
|
+
case NodeTag.StringMin:
|
|
78
|
+
case NodeTag.StringMax:
|
|
79
|
+
return foldStringBound(node, nodes, aliases);
|
|
80
|
+
case NodeTag.Regex:
|
|
81
|
+
return foldRegex(node, nodes, aliases);
|
|
82
|
+
case NodeTag.HasOwn:
|
|
83
|
+
return foldHasOwn(node, nodes, aliases);
|
|
84
|
+
case NodeTag.HasOwnData:
|
|
85
|
+
return foldHasOwnData(node, nodes, aliases);
|
|
86
|
+
case NodeTag.StrictKeys:
|
|
87
|
+
return foldStrictKeys(node, nodes, aliases);
|
|
88
|
+
case NodeTag.ArrayEvery:
|
|
89
|
+
return foldArrayEvery(node, nodes, aliases);
|
|
90
|
+
case NodeTag.TupleItems:
|
|
91
|
+
return foldTupleItems(node, nodes, aliases);
|
|
92
|
+
case NodeTag.RecordEvery:
|
|
93
|
+
return foldRecordEvery(node, nodes, aliases);
|
|
94
|
+
case NodeTag.DiscriminantDispatch:
|
|
95
|
+
return foldDiscriminantDispatch(node, nodes, aliases);
|
|
96
|
+
case NodeTag.SchemaCheck:
|
|
97
|
+
return keep(node);
|
|
98
|
+
case NodeTag.And:
|
|
99
|
+
return foldAnd(node, nodes, aliases);
|
|
100
|
+
case NodeTag.Or:
|
|
101
|
+
return foldOr(node, nodes, aliases);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/optimize/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,KAAK,KAAK,EACX,MAAM,gBAAgB,CAAC;AAIxB;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAGjD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file index.ts
|
|
3
|
+
* @brief Public graph optimizer pipeline.
|
|
4
|
+
*/
|
|
5
|
+
import { freezeGraph, isGraphValue } from "../ir/index.js";
|
|
6
|
+
import { compactReachable } from "./compact.js";
|
|
7
|
+
import { foldConstants } from "./fold.js";
|
|
8
|
+
/**
|
|
9
|
+
* @brief optimize graph.
|
|
10
|
+
*/
|
|
11
|
+
export function optimizeGraph(graph) {
|
|
12
|
+
const input = readGraph(graph);
|
|
13
|
+
return freezeGraph(compactReachable(foldConstants(input)));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* @brief read graph.
|
|
17
|
+
*/
|
|
18
|
+
function readGraph(value) {
|
|
19
|
+
if (!isGraphValue(value)) {
|
|
20
|
+
throw new TypeError("optimizeGraph requires a valid TypeSea graph");
|
|
21
|
+
}
|
|
22
|
+
return freezeGraph(value);
|
|
23
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file map-node.ts
|
|
3
|
+
* @brief Shared graph node-id mapping utility.
|
|
4
|
+
*/
|
|
5
|
+
import type { GraphNode, NodeId } from "../ir/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief node id mapper.
|
|
8
|
+
* @details Converts one graph node id into the id visible in a rewritten graph.
|
|
9
|
+
* @invariant The caller owns range validation for the returned id.
|
|
10
|
+
*/
|
|
11
|
+
export type NodeIdMapper = (value: NodeId) => NodeId;
|
|
12
|
+
/**
|
|
13
|
+
* @brief map node ids.
|
|
14
|
+
* @details Rebuilds one graph node with all dependency ids rewritten by the supplied mapper.
|
|
15
|
+
* @param node Borrowed graph node; payload fields are reused when their ids do not change.
|
|
16
|
+
* @param mapId Borrowed mapper applied to every dependency-bearing node id.
|
|
17
|
+
* @param id Replacement id for the returned node.
|
|
18
|
+
* @returns Graph node with rewritten id-bearing fields.
|
|
19
|
+
*/
|
|
20
|
+
export declare function mapNodeIds(node: GraphNode, mapId: NodeIdMapper, id: NodeId): GraphNode;
|
|
21
|
+
//# sourceMappingURL=map-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-node.d.ts","sourceRoot":"","sources":["../../src/optimize/map-node.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,MAAM,EACP,MAAM,gBAAgB,CAAC;AAExB;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAErD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,MAAM,GACT,SAAS,CA+LX"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file map-node.ts
|
|
3
|
+
* @brief Shared graph node-id mapping utility.
|
|
4
|
+
*/
|
|
5
|
+
import { NodeTag } from "../kind/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief map node ids.
|
|
8
|
+
* @details Rebuilds one graph node with all dependency ids rewritten by the supplied mapper.
|
|
9
|
+
* @param node Borrowed graph node; payload fields are reused when their ids do not change.
|
|
10
|
+
* @param mapId Borrowed mapper applied to every dependency-bearing node id.
|
|
11
|
+
* @param id Replacement id for the returned node.
|
|
12
|
+
* @returns Graph node with rewritten id-bearing fields.
|
|
13
|
+
*/
|
|
14
|
+
export function mapNodeIds(node, mapId, id) {
|
|
15
|
+
switch (node.tag) {
|
|
16
|
+
case NodeTag.Start:
|
|
17
|
+
return {
|
|
18
|
+
id,
|
|
19
|
+
tag: node.tag,
|
|
20
|
+
deps: []
|
|
21
|
+
};
|
|
22
|
+
case NodeTag.Param:
|
|
23
|
+
return {
|
|
24
|
+
id,
|
|
25
|
+
tag: node.tag,
|
|
26
|
+
deps: [],
|
|
27
|
+
name: node.name
|
|
28
|
+
};
|
|
29
|
+
case NodeTag.Const:
|
|
30
|
+
return {
|
|
31
|
+
id,
|
|
32
|
+
tag: node.tag,
|
|
33
|
+
deps: [],
|
|
34
|
+
value: node.value
|
|
35
|
+
};
|
|
36
|
+
case NodeTag.GetProp: {
|
|
37
|
+
const object = mapId(node.object);
|
|
38
|
+
return {
|
|
39
|
+
id,
|
|
40
|
+
tag: node.tag,
|
|
41
|
+
deps: [object],
|
|
42
|
+
object,
|
|
43
|
+
key: node.key
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
case NodeTag.IsString:
|
|
47
|
+
case NodeTag.IsNumber:
|
|
48
|
+
case NodeTag.IsBoolean:
|
|
49
|
+
case NodeTag.IsObject:
|
|
50
|
+
case NodeTag.IsArray:
|
|
51
|
+
case NodeTag.IsUndefined:
|
|
52
|
+
case NodeTag.IsNull:
|
|
53
|
+
case NodeTag.IsInteger:
|
|
54
|
+
case NodeTag.Not:
|
|
55
|
+
case NodeTag.IsBigInt:
|
|
56
|
+
case NodeTag.IsSymbol: {
|
|
57
|
+
const value = mapId(node.value);
|
|
58
|
+
return {
|
|
59
|
+
id,
|
|
60
|
+
tag: node.tag,
|
|
61
|
+
deps: [value],
|
|
62
|
+
value
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
case NodeTag.Equals:
|
|
66
|
+
case NodeTag.Gte:
|
|
67
|
+
case NodeTag.Lte: {
|
|
68
|
+
const left = mapId(node.left);
|
|
69
|
+
const right = mapId(node.right);
|
|
70
|
+
return {
|
|
71
|
+
id,
|
|
72
|
+
tag: node.tag,
|
|
73
|
+
deps: [left, right],
|
|
74
|
+
left,
|
|
75
|
+
right
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
case NodeTag.StringMin:
|
|
79
|
+
case NodeTag.StringMax: {
|
|
80
|
+
const value = mapId(node.value);
|
|
81
|
+
return {
|
|
82
|
+
id,
|
|
83
|
+
tag: node.tag,
|
|
84
|
+
deps: [value],
|
|
85
|
+
value,
|
|
86
|
+
bound: node.bound
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
case NodeTag.Regex: {
|
|
90
|
+
const value = mapId(node.value);
|
|
91
|
+
return {
|
|
92
|
+
id,
|
|
93
|
+
tag: node.tag,
|
|
94
|
+
deps: [value],
|
|
95
|
+
value,
|
|
96
|
+
regex: node.regex,
|
|
97
|
+
name: node.name
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
case NodeTag.HasOwn: {
|
|
101
|
+
const object = mapId(node.object);
|
|
102
|
+
return {
|
|
103
|
+
id,
|
|
104
|
+
tag: node.tag,
|
|
105
|
+
deps: [object],
|
|
106
|
+
object,
|
|
107
|
+
key: node.key
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
case NodeTag.HasOwnData: {
|
|
111
|
+
const object = mapId(node.object);
|
|
112
|
+
return {
|
|
113
|
+
id,
|
|
114
|
+
tag: node.tag,
|
|
115
|
+
deps: [object],
|
|
116
|
+
object,
|
|
117
|
+
key: node.key
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
case NodeTag.StrictKeys: {
|
|
121
|
+
const object = mapId(node.object);
|
|
122
|
+
return {
|
|
123
|
+
id,
|
|
124
|
+
tag: node.tag,
|
|
125
|
+
deps: [object],
|
|
126
|
+
object,
|
|
127
|
+
keys: node.keys
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
case NodeTag.ArrayEvery: {
|
|
131
|
+
const value = mapId(node.value);
|
|
132
|
+
return {
|
|
133
|
+
id,
|
|
134
|
+
tag: node.tag,
|
|
135
|
+
deps: [value],
|
|
136
|
+
value,
|
|
137
|
+
item: node.item
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
case NodeTag.TupleItems: {
|
|
141
|
+
const value = mapId(node.value);
|
|
142
|
+
return {
|
|
143
|
+
id,
|
|
144
|
+
tag: node.tag,
|
|
145
|
+
deps: [value],
|
|
146
|
+
value,
|
|
147
|
+
items: node.items
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
case NodeTag.RecordEvery: {
|
|
151
|
+
const value = mapId(node.value);
|
|
152
|
+
return {
|
|
153
|
+
id,
|
|
154
|
+
tag: node.tag,
|
|
155
|
+
deps: [value],
|
|
156
|
+
value,
|
|
157
|
+
item: node.item
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
case NodeTag.DiscriminantDispatch: {
|
|
161
|
+
const value = mapId(node.value);
|
|
162
|
+
return {
|
|
163
|
+
id,
|
|
164
|
+
tag: node.tag,
|
|
165
|
+
deps: [value],
|
|
166
|
+
value,
|
|
167
|
+
key: node.key,
|
|
168
|
+
literals: node.literals,
|
|
169
|
+
schemas: node.schemas,
|
|
170
|
+
lookup: node.lookup
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
case NodeTag.SchemaCheck: {
|
|
174
|
+
const value = mapId(node.value);
|
|
175
|
+
return {
|
|
176
|
+
id,
|
|
177
|
+
tag: node.tag,
|
|
178
|
+
deps: [value],
|
|
179
|
+
value,
|
|
180
|
+
schema: node.schema
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
case NodeTag.And:
|
|
184
|
+
case NodeTag.Or: {
|
|
185
|
+
const values = mapNodeIdArray(node.values, mapId);
|
|
186
|
+
return {
|
|
187
|
+
id,
|
|
188
|
+
tag: node.tag,
|
|
189
|
+
deps: values,
|
|
190
|
+
values
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
case NodeTag.Return: {
|
|
194
|
+
const control = mapId(node.control);
|
|
195
|
+
const value = mapId(node.value);
|
|
196
|
+
return {
|
|
197
|
+
id,
|
|
198
|
+
tag: node.tag,
|
|
199
|
+
deps: [control, value],
|
|
200
|
+
control,
|
|
201
|
+
value
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* @brief map node id array.
|
|
208
|
+
* @details Applies one mapper to a dense node-id vector.
|
|
209
|
+
* @param values Borrowed input vector.
|
|
210
|
+
* @param mapId Borrowed mapper applied to each slot.
|
|
211
|
+
* @returns New dense vector with mapped ids.
|
|
212
|
+
*/
|
|
213
|
+
function mapNodeIdArray(values, mapId) {
|
|
214
|
+
const mapped = new Array(values.length);
|
|
215
|
+
for (let index = 0; index < values.length; index += 1) {
|
|
216
|
+
const value = values[index];
|
|
217
|
+
if (value !== undefined) {
|
|
218
|
+
mapped[index] = mapId(value);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return mapped;
|
|
222
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file optimize-remap.ts
|
|
3
|
+
* @brief Dense node-id remapping helpers for graph compaction.
|
|
4
|
+
*/
|
|
5
|
+
import type { GraphNode, NodeId } from "../ir/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief remap node.
|
|
8
|
+
* @details Applies a compacted id table to one graph node and its dependencies.
|
|
9
|
+
* @param node Borrowed graph node from the old dense graph.
|
|
10
|
+
* @param remap Borrowed old-id to new-id table.
|
|
11
|
+
* @returns Graph node rewritten into the compacted id space.
|
|
12
|
+
*/
|
|
13
|
+
export declare function remapNode(node: GraphNode, remap: readonly NodeId[]): GraphNode;
|
|
14
|
+
/**
|
|
15
|
+
* @brief remap id.
|
|
16
|
+
* @details Reads one mandatory entry from the compacted id table.
|
|
17
|
+
* @param value Borrowed old node id.
|
|
18
|
+
* @param remap Borrowed old-id to new-id table.
|
|
19
|
+
* @returns New node id for the compacted graph.
|
|
20
|
+
*/
|
|
21
|
+
export declare function remapId(value: NodeId, remap: readonly NodeId[]): NodeId;
|
|
22
|
+
/**
|
|
23
|
+
* @brief remap ids.
|
|
24
|
+
* @details Applies a compacted id table to a dense node-id vector.
|
|
25
|
+
* @param values Borrowed old-id vector.
|
|
26
|
+
* @param remap Borrowed old-id to new-id table.
|
|
27
|
+
* @returns New dense vector in compacted id space.
|
|
28
|
+
*/
|
|
29
|
+
export declare function remapIds(values: readonly NodeId[], remap: readonly NodeId[]): NodeId[];
|
|
30
|
+
//# sourceMappingURL=remap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remap.d.ts","sourceRoot":"","sources":["../../src/optimize/remap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,MAAM,EACP,MAAM,gBAAgB,CAAC;AAGxB;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,SAAS,CAMX;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAMvE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAStF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file optimize-remap.ts
|
|
3
|
+
* @brief Dense node-id remapping helpers for graph compaction.
|
|
4
|
+
*/
|
|
5
|
+
import { mapNodeIds } from "./map-node.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief remap node.
|
|
8
|
+
* @details Applies a compacted id table to one graph node and its dependencies.
|
|
9
|
+
* @param node Borrowed graph node from the old dense graph.
|
|
10
|
+
* @param remap Borrowed old-id to new-id table.
|
|
11
|
+
* @returns Graph node rewritten into the compacted id space.
|
|
12
|
+
*/
|
|
13
|
+
export function remapNode(node, remap) {
|
|
14
|
+
return mapNodeIds(node, (value) => remapId(value, remap), remapId(node.id, remap));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* @brief remap id.
|
|
18
|
+
* @details Reads one mandatory entry from the compacted id table.
|
|
19
|
+
* @param value Borrowed old node id.
|
|
20
|
+
* @param remap Borrowed old-id to new-id table.
|
|
21
|
+
* @returns New node id for the compacted graph.
|
|
22
|
+
*/
|
|
23
|
+
export function remapId(value, remap) {
|
|
24
|
+
const mapped = remap[value];
|
|
25
|
+
if (mapped === undefined) {
|
|
26
|
+
throw new Error("Unreachable dependency escaped graph optimization");
|
|
27
|
+
}
|
|
28
|
+
return mapped;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @brief remap ids.
|
|
32
|
+
* @details Applies a compacted id table to a dense node-id vector.
|
|
33
|
+
* @param values Borrowed old-id vector.
|
|
34
|
+
* @param remap Borrowed old-id to new-id table.
|
|
35
|
+
* @returns New dense vector in compacted id space.
|
|
36
|
+
*/
|
|
37
|
+
export function remapIds(values, remap) {
|
|
38
|
+
const remapped = new Array(values.length);
|
|
39
|
+
for (let index = 0; index < values.length; index += 1) {
|
|
40
|
+
const value = values[index];
|
|
41
|
+
if (value !== undefined) {
|
|
42
|
+
remapped[index] = remapId(value, remap);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return remapped;
|
|
46
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file rewrite.ts
|
|
3
|
+
* @brief Node dependency rewrite utilities.
|
|
4
|
+
*/
|
|
5
|
+
import type { GraphNode, NodeId } from "../ir/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief rewrite node deps.
|
|
8
|
+
* @details Resolves dependency aliases while preserving the node's own id.
|
|
9
|
+
* @param node Borrowed graph node to rewrite.
|
|
10
|
+
* @param aliases Borrowed alias table produced by the folding pass.
|
|
11
|
+
* @returns Graph node with dependency ids rewritten through the alias table.
|
|
12
|
+
*/
|
|
13
|
+
export declare function rewriteNodeDeps(node: GraphNode, aliases: readonly NodeId[]): GraphNode;
|
|
14
|
+
/**
|
|
15
|
+
* @brief resolve alias.
|
|
16
|
+
* @details Follows an alias chain until it reaches a stable node id.
|
|
17
|
+
* @param value Borrowed node id to resolve.
|
|
18
|
+
* @param aliases Borrowed alias table.
|
|
19
|
+
* @returns Canonical node id for the current folding pass.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveAlias(value: NodeId, aliases: readonly NodeId[]): NodeId;
|
|
22
|
+
//# sourceMappingURL=rewrite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewrite.d.ts","sourceRoot":"","sources":["../../src/optimize/rewrite.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,MAAM,EACP,MAAM,gBAAgB,CAAC;AAGxB;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,SAAS,CAMX;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAW9E"}
|