@rcrsr/rill 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/LICENSE +21 -0
- package/README.md +187 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +69 -0
- package/dist/cli.js.map +1 -0
- package/dist/demo.d.ts +6 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +121 -0
- package/dist/demo.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer/errors.d.ts +9 -0
- package/dist/lexer/errors.d.ts.map +1 -0
- package/dist/lexer/errors.js +12 -0
- package/dist/lexer/errors.js.map +1 -0
- package/dist/lexer/helpers.d.ts +14 -0
- package/dist/lexer/helpers.d.ts.map +1 -0
- package/dist/lexer/helpers.js +30 -0
- package/dist/lexer/helpers.js.map +1 -0
- package/dist/lexer/index.d.ts +8 -0
- package/dist/lexer/index.d.ts.map +1 -0
- package/dist/lexer/index.js +8 -0
- package/dist/lexer/index.js.map +1 -0
- package/dist/lexer/operators.d.ts +11 -0
- package/dist/lexer/operators.d.ts.map +1 -0
- package/dist/lexer/operators.js +58 -0
- package/dist/lexer/operators.js.map +1 -0
- package/dist/lexer/readers.d.ts +12 -0
- package/dist/lexer/readers.d.ts.map +1 -0
- package/dist/lexer/readers.js +144 -0
- package/dist/lexer/readers.js.map +1 -0
- package/dist/lexer/state.d.ts +18 -0
- package/dist/lexer/state.d.ts.map +1 -0
- package/dist/lexer/state.js +37 -0
- package/dist/lexer/state.js.map +1 -0
- package/dist/lexer/tokenizer.d.ts +9 -0
- package/dist/lexer/tokenizer.d.ts.map +1 -0
- package/dist/lexer/tokenizer.js +100 -0
- package/dist/lexer/tokenizer.js.map +1 -0
- package/dist/lexer.d.ts +19 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +344 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser/arithmetic.d.ts +16 -0
- package/dist/parser/arithmetic.d.ts.map +1 -0
- package/dist/parser/arithmetic.js +128 -0
- package/dist/parser/arithmetic.js.map +1 -0
- package/dist/parser/boolean.d.ts +15 -0
- package/dist/parser/boolean.d.ts.map +1 -0
- package/dist/parser/boolean.js +20 -0
- package/dist/parser/boolean.js.map +1 -0
- package/dist/parser/control-flow.d.ts +56 -0
- package/dist/parser/control-flow.d.ts.map +1 -0
- package/dist/parser/control-flow.js +167 -0
- package/dist/parser/control-flow.js.map +1 -0
- package/dist/parser/expressions.d.ts +23 -0
- package/dist/parser/expressions.d.ts.map +1 -0
- package/dist/parser/expressions.js +950 -0
- package/dist/parser/expressions.js.map +1 -0
- package/dist/parser/extraction.d.ts +48 -0
- package/dist/parser/extraction.d.ts.map +1 -0
- package/dist/parser/extraction.js +279 -0
- package/dist/parser/extraction.js.map +1 -0
- package/dist/parser/functions.d.ts +20 -0
- package/dist/parser/functions.d.ts.map +1 -0
- package/dist/parser/functions.js +96 -0
- package/dist/parser/functions.js.map +1 -0
- package/dist/parser/helpers.d.ts +94 -0
- package/dist/parser/helpers.d.ts.map +1 -0
- package/dist/parser/helpers.js +225 -0
- package/dist/parser/helpers.js.map +1 -0
- package/dist/parser/index.d.ts +49 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +73 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/literals.d.ts +37 -0
- package/dist/parser/literals.d.ts.map +1 -0
- package/dist/parser/literals.js +373 -0
- package/dist/parser/literals.js.map +1 -0
- package/dist/parser/parser-collect.d.ts +16 -0
- package/dist/parser/parser-collect.d.ts.map +1 -0
- package/dist/parser/parser-collect.js +125 -0
- package/dist/parser/parser-collect.js.map +1 -0
- package/dist/parser/parser-control.d.ts +20 -0
- package/dist/parser/parser-control.d.ts.map +1 -0
- package/dist/parser/parser-control.js +120 -0
- package/dist/parser/parser-control.js.map +1 -0
- package/dist/parser/parser-expr.d.ts +37 -0
- package/dist/parser/parser-expr.d.ts.map +1 -0
- package/dist/parser/parser-expr.js +639 -0
- package/dist/parser/parser-expr.js.map +1 -0
- package/dist/parser/parser-extract.d.ts +17 -0
- package/dist/parser/parser-extract.d.ts.map +1 -0
- package/dist/parser/parser-extract.js +222 -0
- package/dist/parser/parser-extract.js.map +1 -0
- package/dist/parser/parser-functions.d.ts +21 -0
- package/dist/parser/parser-functions.d.ts.map +1 -0
- package/dist/parser/parser-functions.js +155 -0
- package/dist/parser/parser-functions.js.map +1 -0
- package/dist/parser/parser-literals.d.ts +22 -0
- package/dist/parser/parser-literals.d.ts.map +1 -0
- package/dist/parser/parser-literals.js +288 -0
- package/dist/parser/parser-literals.js.map +1 -0
- package/dist/parser/parser-script.d.ts +21 -0
- package/dist/parser/parser-script.d.ts.map +1 -0
- package/dist/parser/parser-script.js +174 -0
- package/dist/parser/parser-script.js.map +1 -0
- package/dist/parser/parser-variables.d.ts +20 -0
- package/dist/parser/parser-variables.d.ts.map +1 -0
- package/dist/parser/parser-variables.js +146 -0
- package/dist/parser/parser-variables.js.map +1 -0
- package/dist/parser/parser.d.ts +49 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/parser/parser.js +54 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/parser/script.d.ts +14 -0
- package/dist/parser/script.d.ts.map +1 -0
- package/dist/parser/script.js +196 -0
- package/dist/parser/script.js.map +1 -0
- package/dist/parser/state.d.ts +40 -0
- package/dist/parser/state.d.ts.map +1 -0
- package/dist/parser/state.js +129 -0
- package/dist/parser/state.js.map +1 -0
- package/dist/parser/variables.d.ts +10 -0
- package/dist/parser/variables.d.ts.map +1 -0
- package/dist/parser/variables.js +215 -0
- package/dist/parser/variables.js.map +1 -0
- package/dist/runtime/ast-equals.d.ts +13 -0
- package/dist/runtime/ast-equals.d.ts.map +1 -0
- package/dist/runtime/ast-equals.js +447 -0
- package/dist/runtime/ast-equals.js.map +1 -0
- package/dist/runtime/builtins.d.ts +13 -0
- package/dist/runtime/builtins.d.ts.map +1 -0
- package/dist/runtime/builtins.js +180 -0
- package/dist/runtime/builtins.js.map +1 -0
- package/dist/runtime/callable.d.ts +88 -0
- package/dist/runtime/callable.d.ts.map +1 -0
- package/dist/runtime/callable.js +98 -0
- package/dist/runtime/callable.js.map +1 -0
- package/dist/runtime/context.d.ts +13 -0
- package/dist/runtime/context.d.ts.map +1 -0
- package/dist/runtime/context.js +73 -0
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/core/callable.d.ts +171 -0
- package/dist/runtime/core/callable.d.ts.map +1 -0
- package/dist/runtime/core/callable.js +246 -0
- package/dist/runtime/core/callable.js.map +1 -0
- package/dist/runtime/core/context.d.ts +29 -0
- package/dist/runtime/core/context.d.ts.map +1 -0
- package/dist/runtime/core/context.js +154 -0
- package/dist/runtime/core/context.js.map +1 -0
- package/dist/runtime/core/equals.d.ts +9 -0
- package/dist/runtime/core/equals.d.ts.map +1 -0
- package/dist/runtime/core/equals.js +381 -0
- package/dist/runtime/core/equals.js.map +1 -0
- package/dist/runtime/core/eval/base.d.ts +65 -0
- package/dist/runtime/core/eval/base.d.ts.map +1 -0
- package/dist/runtime/core/eval/base.js +112 -0
- package/dist/runtime/core/eval/base.js.map +1 -0
- package/dist/runtime/core/eval/evaluator.d.ts +47 -0
- package/dist/runtime/core/eval/evaluator.d.ts.map +1 -0
- package/dist/runtime/core/eval/evaluator.js +73 -0
- package/dist/runtime/core/eval/evaluator.js.map +1 -0
- package/dist/runtime/core/eval/index.d.ts +57 -0
- package/dist/runtime/core/eval/index.d.ts.map +1 -0
- package/dist/runtime/core/eval/index.js +95 -0
- package/dist/runtime/core/eval/index.js.map +1 -0
- package/dist/runtime/core/eval/mixins/annotations.d.ts +19 -0
- package/dist/runtime/core/eval/mixins/annotations.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/annotations.js +146 -0
- package/dist/runtime/core/eval/mixins/annotations.js.map +1 -0
- package/dist/runtime/core/eval/mixins/closures.d.ts +49 -0
- package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/closures.js +479 -0
- package/dist/runtime/core/eval/mixins/closures.js.map +1 -0
- package/dist/runtime/core/eval/mixins/collections.d.ts +24 -0
- package/dist/runtime/core/eval/mixins/collections.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/collections.js +466 -0
- package/dist/runtime/core/eval/mixins/collections.js.map +1 -0
- package/dist/runtime/core/eval/mixins/control-flow.d.ts +27 -0
- package/dist/runtime/core/eval/mixins/control-flow.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/control-flow.js +369 -0
- package/dist/runtime/core/eval/mixins/control-flow.js.map +1 -0
- package/dist/runtime/core/eval/mixins/core.d.ts +24 -0
- package/dist/runtime/core/eval/mixins/core.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/core.js +335 -0
- package/dist/runtime/core/eval/mixins/core.js.map +1 -0
- package/dist/runtime/core/eval/mixins/expressions.d.ts +19 -0
- package/dist/runtime/core/eval/mixins/expressions.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/expressions.js +202 -0
- package/dist/runtime/core/eval/mixins/expressions.js.map +1 -0
- package/dist/runtime/core/eval/mixins/extraction.d.ts +10 -0
- package/dist/runtime/core/eval/mixins/extraction.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/extraction.js +250 -0
- package/dist/runtime/core/eval/mixins/extraction.js.map +1 -0
- package/dist/runtime/core/eval/mixins/literals.d.ts +23 -0
- package/dist/runtime/core/eval/mixins/literals.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/literals.js +180 -0
- package/dist/runtime/core/eval/mixins/literals.js.map +1 -0
- package/dist/runtime/core/eval/mixins/types.d.ts +20 -0
- package/dist/runtime/core/eval/mixins/types.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/types.js +109 -0
- package/dist/runtime/core/eval/mixins/types.js.map +1 -0
- package/dist/runtime/core/eval/mixins/variables.d.ts +34 -0
- package/dist/runtime/core/eval/mixins/variables.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/variables.js +247 -0
- package/dist/runtime/core/eval/mixins/variables.js.map +1 -0
- package/dist/runtime/core/eval/types.d.ts +41 -0
- package/dist/runtime/core/eval/types.d.ts.map +1 -0
- package/dist/runtime/core/eval/types.js +10 -0
- package/dist/runtime/core/eval/types.js.map +1 -0
- package/dist/runtime/core/evaluate.d.ts +42 -0
- package/dist/runtime/core/evaluate.d.ts.map +1 -0
- package/dist/runtime/core/evaluate.debug.js +1251 -0
- package/dist/runtime/core/evaluate.js +1913 -0
- package/dist/runtime/core/evaluate.js.map +1 -0
- package/dist/runtime/core/execute.d.ts +26 -0
- package/dist/runtime/core/execute.d.ts.map +1 -0
- package/dist/runtime/core/execute.js +177 -0
- package/dist/runtime/core/execute.js.map +1 -0
- package/dist/runtime/core/signals.d.ts +19 -0
- package/dist/runtime/core/signals.d.ts.map +1 -0
- package/dist/runtime/core/signals.js +26 -0
- package/dist/runtime/core/signals.js.map +1 -0
- package/dist/runtime/core/types.d.ts +177 -0
- package/dist/runtime/core/types.d.ts.map +1 -0
- package/dist/runtime/core/types.js +50 -0
- package/dist/runtime/core/types.js.map +1 -0
- package/dist/runtime/core/values.d.ts +66 -0
- package/dist/runtime/core/values.d.ts.map +1 -0
- package/dist/runtime/core/values.js +240 -0
- package/dist/runtime/core/values.js.map +1 -0
- package/dist/runtime/evaluate.d.ts +32 -0
- package/dist/runtime/evaluate.d.ts.map +1 -0
- package/dist/runtime/evaluate.js +1111 -0
- package/dist/runtime/evaluate.js.map +1 -0
- package/dist/runtime/execute.d.ts +26 -0
- package/dist/runtime/execute.d.ts.map +1 -0
- package/dist/runtime/execute.js +121 -0
- package/dist/runtime/execute.js.map +1 -0
- package/dist/runtime/ext/builtins.d.ts +16 -0
- package/dist/runtime/ext/builtins.d.ts.map +1 -0
- package/dist/runtime/ext/builtins.js +528 -0
- package/dist/runtime/ext/builtins.js.map +1 -0
- package/dist/runtime/ext/content-parser.d.ts +83 -0
- package/dist/runtime/ext/content-parser.d.ts.map +1 -0
- package/dist/runtime/ext/content-parser.js +536 -0
- package/dist/runtime/ext/content-parser.js.map +1 -0
- package/dist/runtime/index.d.ts +28 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +34 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/signals.d.ts +19 -0
- package/dist/runtime/signals.d.ts.map +1 -0
- package/dist/runtime/signals.js +26 -0
- package/dist/runtime/signals.js.map +1 -0
- package/dist/runtime/types.d.ts +169 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +50 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/values.d.ts +50 -0
- package/dist/runtime/values.d.ts.map +1 -0
- package/dist/runtime/values.js +209 -0
- package/dist/runtime/values.js.map +1 -0
- package/dist/runtime.d.ts +254 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +2014 -0
- package/dist/runtime.js.map +1 -0
- package/dist/types.d.ts +752 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +189 -0
- package/dist/types.js.map +1 -0
- package/docs/00_INDEX.md +65 -0
- package/docs/01_guide.md +390 -0
- package/docs/02_types.md +399 -0
- package/docs/03_variables.md +314 -0
- package/docs/04_operators.md +551 -0
- package/docs/05_control-flow.md +350 -0
- package/docs/06_closures.md +353 -0
- package/docs/07_collections.md +686 -0
- package/docs/08_iterators.md +330 -0
- package/docs/09_strings.md +205 -0
- package/docs/10_parsing.md +366 -0
- package/docs/11_reference.md +350 -0
- package/docs/12_examples.md +771 -0
- package/docs/13_modules.md +519 -0
- package/docs/14_host-integration.md +826 -0
- package/docs/15_grammar.ebnf +693 -0
- package/docs/16_conventions.md +696 -0
- package/docs/99_llm-reference.txt +300 -0
- package/docs/assets/logo.png +0 -0
- package/package.json +70 -0
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CollectionsMixin: each/map/fold/filter
|
|
3
|
+
*
|
|
4
|
+
* Handles collection operators:
|
|
5
|
+
* - Each: sequential iteration with all results (partial results on break)
|
|
6
|
+
* - Map: parallel iteration with all results
|
|
7
|
+
* - Fold: sequential reduction to final value
|
|
8
|
+
* - Filter: parallel filtering by predicate
|
|
9
|
+
*
|
|
10
|
+
* Interface requirements (from spec):
|
|
11
|
+
* - evaluateEach(node, input) -> Promise<RillValue[]>
|
|
12
|
+
* - evaluateMap(node, input) -> Promise<RillValue[]>
|
|
13
|
+
* - evaluateFold(node, input) -> Promise<RillValue>
|
|
14
|
+
* - evaluateFilter(node, input) -> Promise<RillValue[]>
|
|
15
|
+
*
|
|
16
|
+
* Error Handling:
|
|
17
|
+
* - Non-iterable inputs throw RuntimeError(RUNTIME_TYPE_ERROR) [EC-10]
|
|
18
|
+
* - Iterator body evaluation errors propagate correctly [EC-11]
|
|
19
|
+
* - Iteration limit exceeded throws RuntimeError [EC-12]
|
|
20
|
+
*
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
import { RuntimeError, RILL_ERROR_CODES } from '../../../../types.js';
|
|
24
|
+
import { inferType, isRillIterator } from '../../values.js';
|
|
25
|
+
import { createChildContext, getVariable } from '../../context.js';
|
|
26
|
+
import { BreakSignal } from '../../signals.js';
|
|
27
|
+
import { isCallable, isDict } from '../../callable.js';
|
|
28
|
+
import { getEvaluator } from '../evaluator.js';
|
|
29
|
+
/**
|
|
30
|
+
* Default maximum iteration count for iterators.
|
|
31
|
+
* Can be overridden with ^(limit: N) annotation.
|
|
32
|
+
*/
|
|
33
|
+
const DEFAULT_MAX_ITERATIONS = 10000;
|
|
34
|
+
/**
|
|
35
|
+
* CollectionsMixin implementation.
|
|
36
|
+
*
|
|
37
|
+
* Evaluates collection operators: each, map, fold, filter.
|
|
38
|
+
* Handles iteration over lists, strings, dicts, and iterators.
|
|
39
|
+
*
|
|
40
|
+
* Depends on:
|
|
41
|
+
* - EvaluatorBase: ctx, checkAborted(), getNodeLocation()
|
|
42
|
+
* - evaluateExpression() (from future CoreMixin composition)
|
|
43
|
+
* - evaluateBlockExpression() (from ControlFlowMixin)
|
|
44
|
+
* - evaluateGroupedExpr() (from ExpressionsMixin)
|
|
45
|
+
* - evaluateVariableAsync() (from VariablesMixin)
|
|
46
|
+
* - evaluatePrimary() (from future CoreMixin composition)
|
|
47
|
+
* - invokeCallable() (from future CoreMixin composition)
|
|
48
|
+
* - createClosure() (from future CoreMixin composition)
|
|
49
|
+
*
|
|
50
|
+
* Methods added:
|
|
51
|
+
* - evaluateEach(node, input) -> Promise<RillValue[]>
|
|
52
|
+
* - evaluateMap(node, input) -> Promise<RillValue[]>
|
|
53
|
+
* - evaluateFold(node, input) -> Promise<RillValue>
|
|
54
|
+
* - evaluateFilter(node, input) -> Promise<RillValue[]>
|
|
55
|
+
* - getIterableElements(input) -> Promise<RillValue[]> (helper)
|
|
56
|
+
* - evaluateIteratorBody(body, element, accumulator) -> Promise<RillValue> (helper)
|
|
57
|
+
* - expandIterator(iterator, limit?) -> Promise<RillValue[]> (helper)
|
|
58
|
+
*/
|
|
59
|
+
function createCollectionsMixin(Base) {
|
|
60
|
+
return class CollectionsEvaluator extends Base {
|
|
61
|
+
/**
|
|
62
|
+
* Get elements from an iterable value (list, string, dict, or iterator).
|
|
63
|
+
* Throws RuntimeError if value is not iterable.
|
|
64
|
+
*/
|
|
65
|
+
async getIterableElements(input, node) {
|
|
66
|
+
if (Array.isArray(input)) {
|
|
67
|
+
return input;
|
|
68
|
+
}
|
|
69
|
+
if (typeof input === 'string') {
|
|
70
|
+
return [...input];
|
|
71
|
+
}
|
|
72
|
+
// Check for iterator protocol BEFORE generic dict handling
|
|
73
|
+
if (isRillIterator(input)) {
|
|
74
|
+
return this.expandIterator(input, node);
|
|
75
|
+
}
|
|
76
|
+
if (isDict(input)) {
|
|
77
|
+
// Dict iteration: sorted keys, each element is { key, value }
|
|
78
|
+
const keys = Object.keys(input).sort();
|
|
79
|
+
return keys.map((key) => ({
|
|
80
|
+
key,
|
|
81
|
+
value: input[key],
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, `Collection operators require list, string, dict, or iterator, got ${inferType(input)}`, node.span.start);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Expand an iterator to a list of values.
|
|
88
|
+
* Respects iteration limits to prevent infinite loops.
|
|
89
|
+
*/
|
|
90
|
+
async expandIterator(iterator, node, limit = DEFAULT_MAX_ITERATIONS) {
|
|
91
|
+
const elements = [];
|
|
92
|
+
let current = iterator;
|
|
93
|
+
let count = 0;
|
|
94
|
+
while (!current['done'] && count < limit) {
|
|
95
|
+
this.checkAborted();
|
|
96
|
+
const val = current['value'];
|
|
97
|
+
if (val !== undefined) {
|
|
98
|
+
elements.push(val);
|
|
99
|
+
}
|
|
100
|
+
count++;
|
|
101
|
+
// Invoke next() to get the next iterator
|
|
102
|
+
const nextClosure = current['next'];
|
|
103
|
+
if (nextClosure === undefined || !isCallable(nextClosure)) {
|
|
104
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, 'Iterator .next must be a closure', node.span.start);
|
|
105
|
+
}
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
107
|
+
const nextIterator = await this.invokeCallable(nextClosure, [], this.ctx, node.span.start);
|
|
108
|
+
if (typeof nextIterator !== 'object' || nextIterator === null) {
|
|
109
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, 'Iterator .next must return iterator', node.span.start);
|
|
110
|
+
}
|
|
111
|
+
current = nextIterator;
|
|
112
|
+
}
|
|
113
|
+
if (count >= limit) {
|
|
114
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_LIMIT_EXCEEDED, `Iterator expansion exceeded ${limit} iterations`, node.span.start, { limit, iterations: count });
|
|
115
|
+
}
|
|
116
|
+
return elements;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Evaluate collection body for a single element.
|
|
120
|
+
* Handles all body forms: closure, block, grouped, variable, postfix, spread.
|
|
121
|
+
*
|
|
122
|
+
* NOTE: For sequential operations (each/fold), caller creates child context,
|
|
123
|
+
* sets pipeValue, and swaps this.ctx. For parallel operations (map/filter),
|
|
124
|
+
* caller passes a separate evaluator instance with isolated context.
|
|
125
|
+
*/
|
|
126
|
+
async evaluateIteratorBody(body, element, accumulator) {
|
|
127
|
+
switch (body.type) {
|
|
128
|
+
case 'Closure': {
|
|
129
|
+
// Inline closure: invoke with element (and accumulator if present in params)
|
|
130
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
131
|
+
const closure = await this.createClosure(body, this.ctx);
|
|
132
|
+
const args = [element];
|
|
133
|
+
// Accumulator is passed as second arg if closure has 2+ params
|
|
134
|
+
if (accumulator !== null && closure.params.length >= 2) {
|
|
135
|
+
args.push(accumulator);
|
|
136
|
+
}
|
|
137
|
+
// Create context with $@ for closures that use it (e.g., |x| { $x + $@ })
|
|
138
|
+
let invokeCtx = this.ctx;
|
|
139
|
+
let closureToInvoke = closure;
|
|
140
|
+
if (accumulator !== null) {
|
|
141
|
+
invokeCtx = createChildContext(this.ctx);
|
|
142
|
+
invokeCtx.variables.set('@', accumulator);
|
|
143
|
+
// Create new closure with updated definingScope to include $@
|
|
144
|
+
closureToInvoke = { ...closure, definingScope: invokeCtx };
|
|
145
|
+
}
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
147
|
+
return this.invokeCallable(closureToInvoke, args, invokeCtx, body.span.start);
|
|
148
|
+
}
|
|
149
|
+
case 'Block': {
|
|
150
|
+
// Block: evaluate with $ = element, $@ = accumulator
|
|
151
|
+
// this.ctx already has pipeValue set to element by caller
|
|
152
|
+
if (accumulator !== null) {
|
|
153
|
+
this.ctx.variables.set('@', accumulator);
|
|
154
|
+
}
|
|
155
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
156
|
+
return await this.evaluateBlockExpression(body);
|
|
157
|
+
}
|
|
158
|
+
case 'GroupedExpr': {
|
|
159
|
+
// Grouped: evaluate with $ = element, $@ = accumulator (for fold)
|
|
160
|
+
// this.ctx already has pipeValue set to element by caller
|
|
161
|
+
if (accumulator !== null) {
|
|
162
|
+
this.ctx.variables.set('@', accumulator);
|
|
163
|
+
}
|
|
164
|
+
// Evaluate the inner expression directly (don't call evaluateGroupedExpr,
|
|
165
|
+
// which would create another child context)
|
|
166
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
167
|
+
return await this.evaluatePipeChain(body.expression);
|
|
168
|
+
}
|
|
169
|
+
case 'Variable': {
|
|
170
|
+
// Bare $ = identity, return element unchanged
|
|
171
|
+
if (body.isPipeVar && !body.name && body.accessChain.length === 0) {
|
|
172
|
+
return element;
|
|
173
|
+
}
|
|
174
|
+
// $[idx] or $.field - evaluate access chain on current element
|
|
175
|
+
// this.ctx already has pipeValue set to element by caller
|
|
176
|
+
if (body.isPipeVar && body.accessChain.length > 0) {
|
|
177
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
178
|
+
return await this.evaluateVariableAsync(body);
|
|
179
|
+
}
|
|
180
|
+
// Variable closure: get closure and invoke with element
|
|
181
|
+
const varValue = getVariable(this.ctx, body.name ?? '');
|
|
182
|
+
if (!varValue) {
|
|
183
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_UNDEFINED_VARIABLE, `Undefined variable: $${body.name}`, body.span.start);
|
|
184
|
+
}
|
|
185
|
+
if (!isCallable(varValue)) {
|
|
186
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, `Collection body variable must be callable, got ${inferType(varValue)}`, body.span.start);
|
|
187
|
+
}
|
|
188
|
+
const args = [element];
|
|
189
|
+
if (accumulator !== null &&
|
|
190
|
+
varValue.kind === 'script' &&
|
|
191
|
+
varValue.params.length >= 2) {
|
|
192
|
+
args.push(accumulator);
|
|
193
|
+
}
|
|
194
|
+
// Create context with $@ for accumulator access
|
|
195
|
+
let invokeCtx = this.ctx;
|
|
196
|
+
if (accumulator !== null) {
|
|
197
|
+
invokeCtx = createChildContext(this.ctx);
|
|
198
|
+
invokeCtx.variables.set('@', accumulator);
|
|
199
|
+
}
|
|
200
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
201
|
+
return this.invokeCallable(varValue, args, invokeCtx, body.span.start);
|
|
202
|
+
}
|
|
203
|
+
case 'PostfixExpr': {
|
|
204
|
+
// PostfixExpr: evaluate with $ = element
|
|
205
|
+
// this.ctx already has pipeValue set to element by caller
|
|
206
|
+
if (accumulator !== null) {
|
|
207
|
+
this.ctx.variables.set('@', accumulator);
|
|
208
|
+
}
|
|
209
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
210
|
+
return await this.evaluatePostfixExpr(body);
|
|
211
|
+
}
|
|
212
|
+
case 'Spread': {
|
|
213
|
+
// Spread: return element as tuple
|
|
214
|
+
if (Array.isArray(element)) {
|
|
215
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
216
|
+
return this.createTupleFromList(element);
|
|
217
|
+
}
|
|
218
|
+
if (isDict(element)) {
|
|
219
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
220
|
+
return this.createTupleFromDict(element);
|
|
221
|
+
}
|
|
222
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, `Spread requires list or dict, got ${inferType(element)}`, body.span.start);
|
|
223
|
+
}
|
|
224
|
+
case 'HostCall': {
|
|
225
|
+
// Host function call: invoke with element as first arg
|
|
226
|
+
const fn = this.ctx.functions.get(body.name);
|
|
227
|
+
if (!fn) {
|
|
228
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_UNDEFINED_FUNCTION, `Unknown function: ${body.name}`, body.span.start, { functionName: body.name });
|
|
229
|
+
}
|
|
230
|
+
const args = [element];
|
|
231
|
+
if (accumulator !== null) {
|
|
232
|
+
args.push(accumulator);
|
|
233
|
+
}
|
|
234
|
+
// Handle both CallableFn and ApplicationCallable (task 1.5 will refactor validation)
|
|
235
|
+
const fnToCall = typeof fn === 'function' ? fn : fn.fn;
|
|
236
|
+
return fnToCall(args, this.ctx, body.span.start);
|
|
237
|
+
}
|
|
238
|
+
default: {
|
|
239
|
+
// TypeScript exhaustiveness check - should never reach here
|
|
240
|
+
const unknownBody = body;
|
|
241
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, `Unsupported iterator body type: ${unknownBody.type}`, unknownBody.span.start);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Evaluate each expression: sequential iteration returning list of all results.
|
|
247
|
+
*
|
|
248
|
+
* Syntax forms:
|
|
249
|
+
* collection -> each { body } -- $ is element
|
|
250
|
+
* collection -> each(init) { $@ + $ } -- $@ is accumulator (scan)
|
|
251
|
+
* collection -> each |x| body -- inline closure
|
|
252
|
+
* collection -> each |x, acc = init| body -- closure with accumulator
|
|
253
|
+
*
|
|
254
|
+
* Supports break for early termination (returns partial results).
|
|
255
|
+
*/
|
|
256
|
+
async evaluateEach(node, input) {
|
|
257
|
+
const elements = await this.getIterableElements(input, node);
|
|
258
|
+
// Empty collection: return []
|
|
259
|
+
if (elements.length === 0) {
|
|
260
|
+
return [];
|
|
261
|
+
}
|
|
262
|
+
// Get initial accumulator value if present
|
|
263
|
+
let accumulator = null;
|
|
264
|
+
if (node.accumulator) {
|
|
265
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
266
|
+
accumulator = await this.evaluateExpression(node.accumulator);
|
|
267
|
+
}
|
|
268
|
+
else if (node.body.type === 'Closure' && node.body.params.length >= 2) {
|
|
269
|
+
// Inline closure with accumulator: |x, acc = init| body
|
|
270
|
+
const lastParam = node.body.params[node.body.params.length - 1];
|
|
271
|
+
if (lastParam?.defaultValue) {
|
|
272
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
273
|
+
accumulator = await this.evaluatePrimary(lastParam.defaultValue, this.ctx);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const results = [];
|
|
277
|
+
try {
|
|
278
|
+
for (const element of elements) {
|
|
279
|
+
this.checkAborted(node);
|
|
280
|
+
// Create child context for this iteration
|
|
281
|
+
const iterCtx = createChildContext(this.ctx);
|
|
282
|
+
iterCtx.pipeValue = element;
|
|
283
|
+
if (accumulator !== null) {
|
|
284
|
+
iterCtx.variables.set('@', accumulator);
|
|
285
|
+
}
|
|
286
|
+
// Temporarily swap context
|
|
287
|
+
const savedCtx = this.ctx;
|
|
288
|
+
this.ctx = iterCtx;
|
|
289
|
+
try {
|
|
290
|
+
const result = await this.evaluateIteratorBody(node.body, element, accumulator);
|
|
291
|
+
results.push(result);
|
|
292
|
+
// Update accumulator for next iteration (scan pattern)
|
|
293
|
+
if (accumulator !== null) {
|
|
294
|
+
accumulator = result;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
finally {
|
|
298
|
+
this.ctx = savedCtx;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch (e) {
|
|
303
|
+
if (e instanceof BreakSignal) {
|
|
304
|
+
// Break: return partial results collected before break
|
|
305
|
+
return results;
|
|
306
|
+
}
|
|
307
|
+
throw e;
|
|
308
|
+
}
|
|
309
|
+
return results;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Evaluate map expression: parallel iteration returning list of all results.
|
|
313
|
+
*
|
|
314
|
+
* Uses Promise.all for concurrent execution.
|
|
315
|
+
* Concurrency limit via ^(limit: N) annotation.
|
|
316
|
+
*
|
|
317
|
+
* NOTE: Each iteration uses a separate evaluator instance with its own context
|
|
318
|
+
* to avoid late binding issues in parallel execution. This ensures that each
|
|
319
|
+
* iteration sees its own $ value without interference from other parallel iterations.
|
|
320
|
+
*/
|
|
321
|
+
async evaluateMap(node, input) {
|
|
322
|
+
const elements = await this.getIterableElements(input, node);
|
|
323
|
+
// Empty collection: return []
|
|
324
|
+
if (elements.length === 0) {
|
|
325
|
+
return [];
|
|
326
|
+
}
|
|
327
|
+
// Check for concurrency limit annotation
|
|
328
|
+
const limitAnnotation = this.ctx.annotationStack.at(-1)?.['limit'];
|
|
329
|
+
const concurrencyLimit = typeof limitAnnotation === 'number' && limitAnnotation > 0
|
|
330
|
+
? Math.floor(limitAnnotation)
|
|
331
|
+
: Infinity;
|
|
332
|
+
if (concurrencyLimit === Infinity) {
|
|
333
|
+
// No limit: all in parallel
|
|
334
|
+
// Create separate evaluator instance for each element to avoid late binding
|
|
335
|
+
const promises = elements.map((element) => {
|
|
336
|
+
const elementCtx = createChildContext(this.ctx);
|
|
337
|
+
elementCtx.pipeValue = element;
|
|
338
|
+
const evaluator = getEvaluator(elementCtx);
|
|
339
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
340
|
+
return evaluator.evaluateIteratorBody(node.body, element, null);
|
|
341
|
+
});
|
|
342
|
+
return Promise.all(promises);
|
|
343
|
+
}
|
|
344
|
+
// With limit: process in batches
|
|
345
|
+
const results = [];
|
|
346
|
+
for (let i = 0; i < elements.length; i += concurrencyLimit) {
|
|
347
|
+
this.checkAborted(node);
|
|
348
|
+
const batch = elements.slice(i, i + concurrencyLimit);
|
|
349
|
+
const batchPromises = batch.map((element) => {
|
|
350
|
+
const elementCtx = createChildContext(this.ctx);
|
|
351
|
+
elementCtx.pipeValue = element;
|
|
352
|
+
const evaluator = getEvaluator(elementCtx);
|
|
353
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
354
|
+
return evaluator.evaluateIteratorBody(node.body, element, null);
|
|
355
|
+
});
|
|
356
|
+
const batchResults = await Promise.all(batchPromises);
|
|
357
|
+
results.push(...batchResults);
|
|
358
|
+
}
|
|
359
|
+
return results;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Evaluate fold expression: sequential reduction returning final result only.
|
|
363
|
+
*
|
|
364
|
+
* Accumulator is required.
|
|
365
|
+
* Empty collection: returns initial accumulator value.
|
|
366
|
+
*/
|
|
367
|
+
async evaluateFold(node, input) {
|
|
368
|
+
const elements = await this.getIterableElements(input, node);
|
|
369
|
+
// Get initial accumulator value
|
|
370
|
+
let accumulator;
|
|
371
|
+
if (node.accumulator) {
|
|
372
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
373
|
+
accumulator = await this.evaluateExpression(node.accumulator);
|
|
374
|
+
}
|
|
375
|
+
else if (node.body.type === 'Closure' && node.body.params.length >= 2) {
|
|
376
|
+
// Inline closure with accumulator: |x, acc = init| body
|
|
377
|
+
const lastParam = node.body.params[node.body.params.length - 1];
|
|
378
|
+
if (lastParam?.defaultValue) {
|
|
379
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
380
|
+
accumulator = await this.evaluatePrimary(lastParam.defaultValue, this.ctx);
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, 'Fold requires accumulator: use |x, acc = init| or fold(init) { }', node.span.start);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
else if (node.body.type === 'Variable' && !node.body.isPipeVar) {
|
|
387
|
+
// Variable closure: the closure itself must have an accumulator default
|
|
388
|
+
const varValue = getVariable(this.ctx, node.body.name ?? '');
|
|
389
|
+
if (!varValue || !isCallable(varValue) || varValue.kind !== 'script') {
|
|
390
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, 'Fold variable must be a script closure with accumulator parameter', node.span.start);
|
|
391
|
+
}
|
|
392
|
+
const lastParam = varValue.params[varValue.params.length - 1];
|
|
393
|
+
if (lastParam && lastParam.defaultValue !== null) {
|
|
394
|
+
accumulator = lastParam.defaultValue;
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, 'Fold closure must have accumulator parameter with default value', node.span.start);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, 'Fold requires accumulator: use |x, acc = init| or fold(init) { }', node.span.start);
|
|
402
|
+
}
|
|
403
|
+
// Empty collection: return initial accumulator
|
|
404
|
+
if (elements.length === 0) {
|
|
405
|
+
return accumulator;
|
|
406
|
+
}
|
|
407
|
+
for (const element of elements) {
|
|
408
|
+
this.checkAborted(node);
|
|
409
|
+
// Create child context for this iteration
|
|
410
|
+
const iterCtx = createChildContext(this.ctx);
|
|
411
|
+
iterCtx.pipeValue = element;
|
|
412
|
+
iterCtx.variables.set('@', accumulator);
|
|
413
|
+
// Temporarily swap context
|
|
414
|
+
const savedCtx = this.ctx;
|
|
415
|
+
this.ctx = iterCtx;
|
|
416
|
+
try {
|
|
417
|
+
accumulator = await this.evaluateIteratorBody(node.body, element, accumulator);
|
|
418
|
+
}
|
|
419
|
+
finally {
|
|
420
|
+
this.ctx = savedCtx;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return accumulator;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Evaluate filter expression: parallel filtering, returns elements where predicate is truthy.
|
|
427
|
+
*
|
|
428
|
+
* Executes predicate for all elements concurrently.
|
|
429
|
+
* Preserves original element order.
|
|
430
|
+
* Empty collection: returns [].
|
|
431
|
+
*
|
|
432
|
+
* NOTE: Each iteration uses a separate evaluator instance with its own context
|
|
433
|
+
* to avoid late binding issues in parallel execution.
|
|
434
|
+
*/
|
|
435
|
+
async evaluateFilter(node, input) {
|
|
436
|
+
const elements = await this.getIterableElements(input, node);
|
|
437
|
+
// Empty collection: return []
|
|
438
|
+
if (elements.length === 0) {
|
|
439
|
+
return [];
|
|
440
|
+
}
|
|
441
|
+
// Evaluate predicate for all elements in parallel
|
|
442
|
+
// Create separate evaluator instance for each element to avoid late binding
|
|
443
|
+
const predicatePromises = elements.map(async (element) => {
|
|
444
|
+
this.checkAborted(node);
|
|
445
|
+
const elementCtx = createChildContext(this.ctx);
|
|
446
|
+
elementCtx.pipeValue = element;
|
|
447
|
+
const evaluator = getEvaluator(elementCtx);
|
|
448
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
449
|
+
const result = await evaluator.evaluateIteratorBody(node.body, element, null);
|
|
450
|
+
// Predicate must return boolean
|
|
451
|
+
if (typeof result !== 'boolean') {
|
|
452
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, `Filter predicate must return boolean, got ${inferType(result)}`, node.span.start);
|
|
453
|
+
}
|
|
454
|
+
return { element, keep: result };
|
|
455
|
+
});
|
|
456
|
+
const results = await Promise.all(predicatePromises);
|
|
457
|
+
// Filter elements where predicate was true
|
|
458
|
+
return results.filter((r) => r.keep).map((r) => r.element);
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
// Export with type assertion to work around TS4094 limitation
|
|
463
|
+
// TypeScript can't generate declarations for functions returning classes with protected members
|
|
464
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
465
|
+
export const CollectionsMixin = createCollectionsMixin;
|
|
466
|
+
//# sourceMappingURL=collections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../../../../../src/runtime/core/eval/mixins/collections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ControlFlowMixin: Conditionals, Loops, and Blocks
|
|
3
|
+
*
|
|
4
|
+
* Handles control flow constructs:
|
|
5
|
+
* - Conditionals (if-else)
|
|
6
|
+
* - While loops
|
|
7
|
+
* - Do-while loops
|
|
8
|
+
* - Block expressions
|
|
9
|
+
* - Body evaluation
|
|
10
|
+
*
|
|
11
|
+
* Interface requirements (from spec):
|
|
12
|
+
* - evaluateConditional(node) -> Promise<RillValue>
|
|
13
|
+
* - evaluateWhileLoop(node) -> Promise<RillValue>
|
|
14
|
+
* - evaluateDoWhileLoop(node) -> Promise<RillValue>
|
|
15
|
+
* - evaluateBlockExpression(node) -> Promise<RillValue>
|
|
16
|
+
* - evaluateBody(node) -> Promise<RillValue>
|
|
17
|
+
* - evaluateBodyExpression(node) -> Promise<RillValue>
|
|
18
|
+
*
|
|
19
|
+
* Error Handling:
|
|
20
|
+
* - Non-boolean conditions throw RuntimeError(RUNTIME_TYPE_ERROR) [EC-15]
|
|
21
|
+
* - BreakSignal/ReturnSignal are caught and handled appropriately [EC-16]
|
|
22
|
+
* - Body evaluation errors propagate correctly [EC-17]
|
|
23
|
+
*
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export declare const ControlFlowMixin: any;
|
|
27
|
+
//# sourceMappingURL=control-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-flow.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/core/eval/mixins/control-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AA6ZH,eAAO,MAAM,gBAAgB,EAA6B,GAAG,CAAC"}
|