mcard-js 2.1.1 → 2.1.2
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/README.md +82 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/ptr/lambda/AlphaConversion.d.ts +42 -0
- package/dist/ptr/lambda/AlphaConversion.d.ts.map +1 -0
- package/dist/ptr/lambda/AlphaConversion.js +244 -0
- package/dist/ptr/lambda/AlphaConversion.js.map +1 -0
- package/dist/ptr/lambda/BetaReduction.d.ts +73 -0
- package/dist/ptr/lambda/BetaReduction.d.ts.map +1 -0
- package/dist/ptr/lambda/BetaReduction.js +322 -0
- package/dist/ptr/lambda/BetaReduction.js.map +1 -0
- package/dist/ptr/lambda/EtaConversion.d.ts +65 -0
- package/dist/ptr/lambda/EtaConversion.d.ts.map +1 -0
- package/dist/ptr/lambda/EtaConversion.js +228 -0
- package/dist/ptr/lambda/EtaConversion.js.map +1 -0
- package/dist/ptr/lambda/FreeVariables.d.ts +44 -0
- package/dist/ptr/lambda/FreeVariables.d.ts.map +1 -0
- package/dist/ptr/lambda/FreeVariables.js +207 -0
- package/dist/ptr/lambda/FreeVariables.js.map +1 -0
- package/dist/ptr/lambda/LambdaRuntime.d.ts +80 -0
- package/dist/ptr/lambda/LambdaRuntime.d.ts.map +1 -0
- package/dist/ptr/lambda/LambdaRuntime.js +417 -0
- package/dist/ptr/lambda/LambdaRuntime.js.map +1 -0
- package/dist/ptr/lambda/LambdaTerm.d.ts +95 -0
- package/dist/ptr/lambda/LambdaTerm.d.ts.map +1 -0
- package/dist/ptr/lambda/LambdaTerm.js +159 -0
- package/dist/ptr/lambda/LambdaTerm.js.map +1 -0
- package/dist/ptr/lambda/index.d.ts +24 -0
- package/dist/ptr/lambda/index.d.ts.map +1 -0
- package/dist/ptr/lambda/index.js +34 -0
- package/dist/ptr/lambda/index.js.map +1 -0
- package/dist/ptr/node/CLMRunner.d.ts +30 -0
- package/dist/ptr/node/CLMRunner.d.ts.map +1 -1
- package/dist/ptr/node/CLMRunner.js +167 -0
- package/dist/ptr/node/CLMRunner.js.map +1 -1
- package/dist/ptr/node/Runtimes.d.ts +8 -1
- package/dist/ptr/node/Runtimes.d.ts.map +1 -1
- package/dist/ptr/node/Runtimes.js +8 -1
- package/dist/ptr/node/Runtimes.js.map +1 -1
- package/dist/storage/schema.d.ts.map +1 -1
- package/dist/storage/schema.js +5 -1
- package/dist/storage/schema.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Free Variables Analysis
|
|
3
|
+
*
|
|
4
|
+
* Computes the set of free variables in a Lambda term.
|
|
5
|
+
* Free variables are those not bound by any enclosing λ.
|
|
6
|
+
*
|
|
7
|
+
* FV(x) = {x}
|
|
8
|
+
* FV(λx.M) = FV(M) \ {x}
|
|
9
|
+
* FV(M N) = FV(M) ∪ FV(N)
|
|
10
|
+
*
|
|
11
|
+
* @module mcard-js/ptr/lambda/FreeVariables
|
|
12
|
+
*/
|
|
13
|
+
import { CardCollection } from '../../model/CardCollection';
|
|
14
|
+
import { IO } from '../../monads/IO';
|
|
15
|
+
import { Maybe } from '../../monads/Maybe';
|
|
16
|
+
/**
|
|
17
|
+
* Compute free variables of a term (by hash)
|
|
18
|
+
* Returns IO<Maybe<Set<string>>> - Nothing if term not found
|
|
19
|
+
*/
|
|
20
|
+
export declare function freeVariables(collection: CardCollection, termHash: string): IO<Maybe<Set<string>>>;
|
|
21
|
+
/**
|
|
22
|
+
* Compute bound variables of a term (by hash)
|
|
23
|
+
* Bound variables are those occurring in binding positions (λx)
|
|
24
|
+
*/
|
|
25
|
+
export declare function boundVariables(collection: CardCollection, termHash: string): IO<Maybe<Set<string>>>;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a variable is free in a term
|
|
28
|
+
*/
|
|
29
|
+
export declare function isFreeIn(collection: CardCollection, variable: string, termHash: string): IO<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Check if a term is closed (has no free variables)
|
|
32
|
+
*/
|
|
33
|
+
export declare function isClosed(collection: CardCollection, termHash: string): IO<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Generate a fresh variable name that is not in the given set
|
|
36
|
+
*/
|
|
37
|
+
export declare function generateFresh(base: string, avoid: Set<string>): string;
|
|
38
|
+
/**
|
|
39
|
+
* Generate a fresh variable avoiding all variables in a term
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateFreshFor(collection: CardCollection, base: string, termHash: string): Promise<string>;
|
|
42
|
+
export declare function difference<T>(a: Set<T>, b: Set<T>): Set<T>;
|
|
43
|
+
export declare function intersection<T>(a: Set<T>, b: Set<T>): Set<T>;
|
|
44
|
+
//# sourceMappingURL=FreeVariables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FreeVariables.d.ts","sourceRoot":"","sources":["../../../src/ptr/lambda/FreeVariables.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C;;;GAGG;AACH,wBAAgB,aAAa,CACzB,UAAU,EAAE,cAAc,EAC1B,QAAQ,EAAE,MAAM,GACjB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAKxB;AAqED;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,UAAU,EAAE,cAAc,EAC1B,QAAQ,EAAE,MAAM,GACjB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAIxB;AAkDD;;GAEG;AACH,wBAAgB,QAAQ,CACpB,UAAU,EAAE,cAAc,EAC1B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACjB,EAAE,CAAC,OAAO,CAAC,CAKb;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACpB,UAAU,EAAE,cAAc,EAC1B,QAAQ,EAAE,MAAM,GACjB,EAAE,CAAC,OAAO,CAAC,CAKb;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CActE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAClC,UAAU,EAAE,cAAc,EAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAcjB;AAcD,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAQ1D;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAQ5D"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Free Variables Analysis
|
|
3
|
+
*
|
|
4
|
+
* Computes the set of free variables in a Lambda term.
|
|
5
|
+
* Free variables are those not bound by any enclosing λ.
|
|
6
|
+
*
|
|
7
|
+
* FV(x) = {x}
|
|
8
|
+
* FV(λx.M) = FV(M) \ {x}
|
|
9
|
+
* FV(M N) = FV(M) ∪ FV(N)
|
|
10
|
+
*
|
|
11
|
+
* @module mcard-js/ptr/lambda/FreeVariables
|
|
12
|
+
*/
|
|
13
|
+
import { loadTerm } from './LambdaTerm';
|
|
14
|
+
import { IO } from '../../monads/IO';
|
|
15
|
+
import { Maybe } from '../../monads/Maybe';
|
|
16
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
17
|
+
// Free Variable Computation
|
|
18
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
19
|
+
/**
|
|
20
|
+
* Compute free variables of a term (by hash)
|
|
21
|
+
* Returns IO<Maybe<Set<string>>> - Nothing if term not found
|
|
22
|
+
*/
|
|
23
|
+
export function freeVariables(collection, termHash) {
|
|
24
|
+
return IO.of(async () => {
|
|
25
|
+
const result = await computeFreeVars(collection, termHash, new Set());
|
|
26
|
+
return result;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Internal recursive implementation with memoization via visited set
|
|
31
|
+
*/
|
|
32
|
+
async function computeFreeVars(collection, termHash, visited) {
|
|
33
|
+
// Cycle detection
|
|
34
|
+
if (visited.has(termHash)) {
|
|
35
|
+
return Maybe.just(new Set());
|
|
36
|
+
}
|
|
37
|
+
visited.add(termHash);
|
|
38
|
+
const term = await loadTerm(collection, termHash);
|
|
39
|
+
if (!term) {
|
|
40
|
+
return Maybe.nothing();
|
|
41
|
+
}
|
|
42
|
+
return Maybe.just(await freeVarsOfTerm(collection, term, visited));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Compute free variables of a term structure
|
|
46
|
+
*/
|
|
47
|
+
async function freeVarsOfTerm(collection, term, visited) {
|
|
48
|
+
switch (term.tag) {
|
|
49
|
+
case 'Var':
|
|
50
|
+
// FV(x) = {x}
|
|
51
|
+
return new Set([term.name]);
|
|
52
|
+
case 'Abs': {
|
|
53
|
+
// FV(λx.M) = FV(M) \ {x}
|
|
54
|
+
const bodyFV = await computeFreeVars(collection, term.body, visited);
|
|
55
|
+
if (bodyFV.isNothing) {
|
|
56
|
+
throw new Error(`Body term not found: ${term.body}`);
|
|
57
|
+
}
|
|
58
|
+
const result = new Set(bodyFV.value);
|
|
59
|
+
result.delete(term.param);
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
case 'App': {
|
|
63
|
+
// FV(M N) = FV(M) ∪ FV(N)
|
|
64
|
+
const funcFV = await computeFreeVars(collection, term.func, visited);
|
|
65
|
+
const argFV = await computeFreeVars(collection, term.arg, visited);
|
|
66
|
+
if (funcFV.isNothing) {
|
|
67
|
+
throw new Error(`Function term not found: ${term.func}`);
|
|
68
|
+
}
|
|
69
|
+
if (argFV.isNothing) {
|
|
70
|
+
throw new Error(`Argument term not found: ${term.arg}`);
|
|
71
|
+
}
|
|
72
|
+
return union(funcFV.value, argFV.value);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
77
|
+
// Bound Variables
|
|
78
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
79
|
+
/**
|
|
80
|
+
* Compute bound variables of a term (by hash)
|
|
81
|
+
* Bound variables are those occurring in binding positions (λx)
|
|
82
|
+
*/
|
|
83
|
+
export function boundVariables(collection, termHash) {
|
|
84
|
+
return IO.of(async () => {
|
|
85
|
+
return computeBoundVars(collection, termHash, new Set());
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async function computeBoundVars(collection, termHash, visited) {
|
|
89
|
+
if (visited.has(termHash)) {
|
|
90
|
+
return Maybe.just(new Set());
|
|
91
|
+
}
|
|
92
|
+
visited.add(termHash);
|
|
93
|
+
const term = await loadTerm(collection, termHash);
|
|
94
|
+
if (!term) {
|
|
95
|
+
return Maybe.nothing();
|
|
96
|
+
}
|
|
97
|
+
switch (term.tag) {
|
|
98
|
+
case 'Var':
|
|
99
|
+
// No bound variables in a variable
|
|
100
|
+
return Maybe.just(new Set());
|
|
101
|
+
case 'Abs': {
|
|
102
|
+
// BV(λx.M) = {x} ∪ BV(M)
|
|
103
|
+
const bodyBV = await computeBoundVars(collection, term.body, visited);
|
|
104
|
+
if (bodyBV.isNothing)
|
|
105
|
+
return bodyBV;
|
|
106
|
+
const result = new Set(bodyBV.value);
|
|
107
|
+
result.add(term.param);
|
|
108
|
+
return Maybe.just(result);
|
|
109
|
+
}
|
|
110
|
+
case 'App': {
|
|
111
|
+
// BV(M N) = BV(M) ∪ BV(N)
|
|
112
|
+
const funcBV = await computeBoundVars(collection, term.func, visited);
|
|
113
|
+
const argBV = await computeBoundVars(collection, term.arg, visited);
|
|
114
|
+
if (funcBV.isNothing || argBV.isNothing) {
|
|
115
|
+
return Maybe.nothing();
|
|
116
|
+
}
|
|
117
|
+
return Maybe.just(union(funcBV.value, argBV.value));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
122
|
+
// Utility: Check if variable is free in term
|
|
123
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
124
|
+
/**
|
|
125
|
+
* Check if a variable is free in a term
|
|
126
|
+
*/
|
|
127
|
+
export function isFreeIn(collection, variable, termHash) {
|
|
128
|
+
return freeVariables(collection, termHash).map(maybeFV => {
|
|
129
|
+
if (maybeFV.isNothing)
|
|
130
|
+
return false;
|
|
131
|
+
return maybeFV.value.has(variable);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check if a term is closed (has no free variables)
|
|
136
|
+
*/
|
|
137
|
+
export function isClosed(collection, termHash) {
|
|
138
|
+
return freeVariables(collection, termHash).map(maybeFV => {
|
|
139
|
+
if (maybeFV.isNothing)
|
|
140
|
+
return false;
|
|
141
|
+
return maybeFV.value.size === 0;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
145
|
+
// Fresh Variable Generation
|
|
146
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
147
|
+
/**
|
|
148
|
+
* Generate a fresh variable name that is not in the given set
|
|
149
|
+
*/
|
|
150
|
+
export function generateFresh(base, avoid) {
|
|
151
|
+
if (!avoid.has(base)) {
|
|
152
|
+
return base;
|
|
153
|
+
}
|
|
154
|
+
let counter = 1;
|
|
155
|
+
let candidate = `${base}${counter}`;
|
|
156
|
+
while (avoid.has(candidate)) {
|
|
157
|
+
counter++;
|
|
158
|
+
candidate = `${base}${counter}`;
|
|
159
|
+
}
|
|
160
|
+
return candidate;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Generate a fresh variable avoiding all variables in a term
|
|
164
|
+
*/
|
|
165
|
+
export async function generateFreshFor(collection, base, termHash) {
|
|
166
|
+
const fvResult = await freeVariables(collection, termHash).run();
|
|
167
|
+
const bvResult = await boundVariables(collection, termHash).run();
|
|
168
|
+
const avoid = new Set();
|
|
169
|
+
if (fvResult.isJust) {
|
|
170
|
+
for (const v of fvResult.value)
|
|
171
|
+
avoid.add(v);
|
|
172
|
+
}
|
|
173
|
+
if (bvResult.isJust) {
|
|
174
|
+
for (const v of bvResult.value)
|
|
175
|
+
avoid.add(v);
|
|
176
|
+
}
|
|
177
|
+
return generateFresh(base, avoid);
|
|
178
|
+
}
|
|
179
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
180
|
+
// Set Utilities
|
|
181
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
182
|
+
function union(a, b) {
|
|
183
|
+
const result = new Set(a);
|
|
184
|
+
for (const item of b) {
|
|
185
|
+
result.add(item);
|
|
186
|
+
}
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
export function difference(a, b) {
|
|
190
|
+
const result = new Set();
|
|
191
|
+
for (const item of a) {
|
|
192
|
+
if (!b.has(item)) {
|
|
193
|
+
result.add(item);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
export function intersection(a, b) {
|
|
199
|
+
const result = new Set();
|
|
200
|
+
for (const item of a) {
|
|
201
|
+
if (b.has(item)) {
|
|
202
|
+
result.add(item);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return result;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=FreeVariables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FreeVariables.js","sourceRoot":"","sources":["../../../src/ptr/lambda/FreeVariables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lambda Runtime - PTR Runtime for Lambda Calculus
|
|
3
|
+
*
|
|
4
|
+
* Implements α-β-η conversions as a PTR runtime, treating MCard hashes
|
|
5
|
+
* as Lambda terms and performing computations that produce new MCards.
|
|
6
|
+
*
|
|
7
|
+
* This runtime can be used via CLM specifications to define and verify
|
|
8
|
+
* Lambda Calculus reductions.
|
|
9
|
+
*
|
|
10
|
+
* @module mcard-js/ptr/lambda/LambdaRuntime
|
|
11
|
+
*/
|
|
12
|
+
import { Runtime } from '../node/RuntimeInterface';
|
|
13
|
+
import { CardCollection } from '../../model/CardCollection';
|
|
14
|
+
import { ReductionStrategy } from './BetaReduction';
|
|
15
|
+
export type LambdaOperation = 'alpha' | 'beta' | 'eta-reduce' | 'eta-expand' | 'normalize' | 'step' | 'alpha-equiv' | 'eta-equiv' | 'alpha-norm' | 'eta-norm' | 'free-vars' | 'is-closed' | 'is-normal' | 'parse' | 'pretty' | 'build';
|
|
16
|
+
export interface LambdaConfig {
|
|
17
|
+
operation: LambdaOperation;
|
|
18
|
+
strategy?: ReductionStrategy;
|
|
19
|
+
maxSteps?: number;
|
|
20
|
+
newName?: string;
|
|
21
|
+
freshVar?: string;
|
|
22
|
+
compareWith?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface LambdaRuntimeResult {
|
|
25
|
+
success: boolean;
|
|
26
|
+
result?: unknown;
|
|
27
|
+
error?: string;
|
|
28
|
+
termHash?: string;
|
|
29
|
+
prettyPrint?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Lambda Calculus Runtime for PTR
|
|
33
|
+
*
|
|
34
|
+
* Executes Lambda Calculus operations on MCard-stored terms.
|
|
35
|
+
*/
|
|
36
|
+
export declare class LambdaRuntime implements Runtime {
|
|
37
|
+
private collection;
|
|
38
|
+
constructor(collection: CardCollection);
|
|
39
|
+
/**
|
|
40
|
+
* Execute a Lambda operation
|
|
41
|
+
*
|
|
42
|
+
* @param codeOrPath - For Lambda runtime, this is the term hash to operate on
|
|
43
|
+
* @param context - Additional context (varies by operation)
|
|
44
|
+
* @param config - Lambda configuration with operation type
|
|
45
|
+
* @param chapterDir - Chapter directory (used for relative paths if needed)
|
|
46
|
+
*/
|
|
47
|
+
execute(codeOrPath: string, context: unknown, config: any, chapterDir: string): Promise<LambdaRuntimeResult>;
|
|
48
|
+
private doAlphaRename;
|
|
49
|
+
private doBetaReduce;
|
|
50
|
+
private doEtaReduce;
|
|
51
|
+
private doEtaExpand;
|
|
52
|
+
private doNormalize;
|
|
53
|
+
private doStep;
|
|
54
|
+
private doAlphaEquiv;
|
|
55
|
+
private doEtaEquiv;
|
|
56
|
+
private doAlphaNormalize;
|
|
57
|
+
private doEtaNormalize;
|
|
58
|
+
private doFreeVars;
|
|
59
|
+
private doIsClosed;
|
|
60
|
+
private doIsNormal;
|
|
61
|
+
private doParse;
|
|
62
|
+
private doPretty;
|
|
63
|
+
private doBuild;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parse a simple Lambda expression string into MCards
|
|
67
|
+
*
|
|
68
|
+
* Syntax:
|
|
69
|
+
* x, y, z - Variables
|
|
70
|
+
* \x.M or λx.M - Abstraction
|
|
71
|
+
* (M N) - Application
|
|
72
|
+
* M N - Application (left-associative)
|
|
73
|
+
*
|
|
74
|
+
* Examples:
|
|
75
|
+
* \x.x - Identity function
|
|
76
|
+
* \f.\x.f x - Application combinator
|
|
77
|
+
* (\x.x) y - Identity applied to y
|
|
78
|
+
*/
|
|
79
|
+
export declare function parseLambdaExpression(collection: CardCollection, expression: string): Promise<string>;
|
|
80
|
+
//# sourceMappingURL=LambdaRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LambdaRuntime.d.ts","sourceRoot":"","sources":["../../../src/ptr/lambda/LambdaRuntime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAW5D,OAAO,EAMH,iBAAiB,EAEpB,MAAM,iBAAiB,CAAC;AA4BzB,MAAM,MAAM,eAAe,GACrB,OAAO,GACP,MAAM,GACN,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,MAAM,GACN,aAAa,GACb,WAAW,GACX,YAAY,GACZ,UAAU,GACV,WAAW,GACX,WAAW,GACX,WAAW,GACX,OAAO,GACP,QAAQ,GACR,OAAO,CACR;AAEL,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,eAAe,CAAC;IAC3B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;;GAIG;AACH,qBAAa,aAAc,YAAW,OAAO;IACzC,OAAO,CAAC,UAAU,CAAiB;gBAEvB,UAAU,EAAE,cAAc;IAItC;;;;;;;OAOG;IACG,OAAO,CACT,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,mBAAmB,CAAC;YA2EjB,aAAa;YAyBb,YAAY;YAgBZ,WAAW;YAgBX,WAAW;YAkBX,WAAW;YA4BX,MAAM;YA0BN,YAAY;YAsBZ,UAAU;YAkBV,gBAAgB;YAgBhB,cAAc;YAYd,UAAU;YAaV,UAAU;YASV,UAAU;YASV,OAAO;YAwBP,QAAQ;YAUR,OAAO;CAgBxB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,qBAAqB,CACvC,UAAU,EAAE,cAAc,EAC1B,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAiFjB"}
|