kumi 0.0.17 → 0.0.19
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -1
- data/.ruby-version +1 -0
- data/CHANGELOG.md +28 -0
- data/CLAUDE.md +26 -139
- data/README.md +143 -372
- data/data/functions/agg/boolean.yaml +14 -0
- data/data/functions/agg/numeric.yaml +80 -0
- data/data/functions/agg/string.yaml +8 -0
- data/data/functions/core/arithmetic.yaml +50 -0
- data/data/functions/core/boolean.yaml +18 -0
- data/data/functions/core/comparison.yaml +42 -0
- data/data/functions/core/constructor.yaml +32 -0
- data/data/functions/core/select.yaml +7 -0
- data/data/functions/core/stencil.yaml +21 -0
- data/data/functions/core/string.yaml +19 -0
- data/data/kernels/javascript/agg/boolean.yaml +12 -0
- data/data/kernels/javascript/agg/numeric.yaml +27 -0
- data/data/kernels/javascript/agg/string.yaml +5 -0
- data/data/kernels/javascript/core/arithmetic.yaml +32 -0
- data/data/kernels/javascript/core/boolean.yaml +12 -0
- data/data/kernels/javascript/core/comparison.yaml +24 -0
- data/data/kernels/javascript/core/constructor.yaml +15 -0
- data/data/kernels/javascript/core/select.yaml +7 -0
- data/data/kernels/javascript/core/string.yaml +12 -0
- data/data/kernels/ruby/agg/boolean.yaml +18 -0
- data/data/kernels/ruby/agg/numeric.yaml +29 -0
- data/data/kernels/ruby/agg/string.yaml +5 -0
- data/data/kernels/ruby/core/arithmetic.yaml +38 -0
- data/data/kernels/ruby/core/boolean.yaml +15 -0
- data/data/kernels/ruby/core/comparison.yaml +30 -0
- data/data/kernels/ruby/core/constructor.yaml +17 -0
- data/data/kernels/ruby/core/select.yaml +4 -0
- data/data/kernels/ruby/core/string.yaml +15 -0
- data/debug_ordering.rb +52 -0
- data/docs/FORM_SCHEMA.md +85 -0
- data/docs/OUTPUT_SCHEMA.md +69 -0
- data/docs/SYNTAX.md +626 -373
- data/golden/array_element/expected/ast.txt +21 -0
- data/golden/array_element/expected/input_plan.txt +5 -0
- data/golden/array_element/expected/lir_00_unoptimized.txt +13 -0
- data/golden/array_element/expected/lir_01_hoist_scalar_references.txt +13 -0
- data/golden/array_element/expected/lir_02_inlined.txt +13 -0
- data/golden/array_element/expected/lir_03_cse.txt +13 -0
- data/golden/array_element/expected/lir_04_1_loop_fusion.txt +13 -0
- data/golden/array_element/expected/lir_04_loop_invcm.txt +13 -0
- data/golden/array_element/expected/lir_06_const_prop.txt +13 -0
- data/golden/array_element/expected/nast.txt +7 -0
- data/golden/array_element/expected/schema_javascript.mjs +13 -0
- data/golden/array_element/expected/schema_ruby.rb +41 -0
- data/golden/array_element/expected/snast.txt +7 -0
- data/golden/array_element/expected.json +5 -0
- data/golden/array_element/input.json +9 -0
- data/golden/array_element/schema.kumi +11 -0
- data/golden/array_index/expected/ast.txt +59 -0
- data/golden/array_index/expected/input_plan.txt +5 -0
- data/golden/array_index/expected/lir_00_unoptimized.txt +41 -0
- data/golden/array_index/expected/lir_01_hoist_scalar_references.txt +41 -0
- data/golden/array_index/expected/lir_02_inlined.txt +42 -0
- data/golden/array_index/expected/lir_03_cse.txt +40 -0
- data/golden/array_index/expected/lir_04_1_loop_fusion.txt +40 -0
- data/golden/array_index/expected/lir_04_loop_invcm.txt +40 -0
- data/golden/array_index/expected/lir_06_const_prop.txt +40 -0
- data/golden/array_index/expected/nast.txt +33 -0
- data/golden/array_index/expected/schema_javascript.mjs +46 -0
- data/golden/array_index/expected/schema_ruby.rb +75 -0
- data/golden/array_index/expected/snast.txt +33 -0
- data/golden/array_index/expected.json +5 -0
- data/golden/array_index/input.json +1 -0
- data/golden/array_index/schema.kumi +19 -0
- data/golden/array_operations/expected/ast.txt +50 -0
- data/golden/array_operations/expected/input_plan.txt +10 -0
- data/golden/array_operations/expected/lir_00_unoptimized.txt +47 -0
- data/golden/array_operations/expected/lir_01_hoist_scalar_references.txt +47 -0
- data/golden/array_operations/expected/lir_02_inlined.txt +47 -0
- data/golden/array_operations/expected/lir_03_cse.txt +47 -0
- data/golden/array_operations/expected/lir_04_1_loop_fusion.txt +47 -0
- data/golden/array_operations/expected/lir_04_loop_invcm.txt +47 -0
- data/golden/array_operations/expected/lir_06_const_prop.txt +47 -0
- data/golden/array_operations/expected/nast.txt +32 -0
- data/golden/array_operations/expected/schema_javascript.mjs +60 -0
- data/golden/array_operations/expected/schema_ruby.rb +91 -0
- data/golden/array_operations/expected/snast.txt +32 -0
- data/golden/array_operations/expected.json +27 -0
- data/golden/array_operations/input.json +8 -0
- data/golden/array_operations/schema.kumi +12 -10
- data/golden/cascade_logic/expected/ast.txt +37 -0
- data/golden/cascade_logic/expected/input_plan.txt +2 -0
- data/golden/cascade_logic/expected/lir_00_unoptimized.txt +29 -0
- data/golden/cascade_logic/expected/lir_01_hoist_scalar_references.txt +29 -0
- data/golden/cascade_logic/expected/lir_02_inlined.txt +37 -0
- data/golden/cascade_logic/expected/lir_03_cse.txt +30 -0
- data/golden/cascade_logic/expected/lir_04_1_loop_fusion.txt +30 -0
- data/golden/cascade_logic/expected/lir_04_loop_invcm.txt +30 -0
- data/golden/cascade_logic/expected/lir_06_const_prop.txt +30 -0
- data/golden/cascade_logic/expected/nast.txt +32 -0
- data/golden/cascade_logic/expected/schema_javascript.mjs +31 -0
- data/golden/cascade_logic/expected/schema_ruby.rb +57 -0
- data/golden/cascade_logic/expected/snast.txt +32 -0
- data/golden/cascade_logic/expected.json +5 -0
- data/golden/cascade_logic/input.json +4 -0
- data/golden/cascade_logic/schema.kumi +1 -3
- data/golden/chained_fusion/expected/ast.txt +57 -0
- data/golden/chained_fusion/expected/input_plan.txt +13 -0
- data/golden/chained_fusion/expected/lir_00_unoptimized.txt +76 -0
- data/golden/chained_fusion/expected/lir_01_hoist_scalar_references.txt +76 -0
- data/golden/chained_fusion/expected/lir_02_inlined.txt +114 -0
- data/golden/chained_fusion/expected/lir_03_cse.txt +97 -0
- data/golden/chained_fusion/expected/lir_04_1_loop_fusion.txt +99 -0
- data/golden/chained_fusion/expected/lir_04_loop_invcm.txt +97 -0
- data/golden/chained_fusion/expected/lir_06_const_prop.txt +97 -0
- data/golden/chained_fusion/expected/nast.txt +55 -0
- data/golden/chained_fusion/expected/schema_javascript.mjs +116 -0
- data/golden/chained_fusion/expected/schema_ruby.rb +149 -0
- data/golden/chained_fusion/expected/snast.txt +55 -0
- data/golden/chained_fusion/expected.json +45 -0
- data/golden/chained_fusion/input.json +51 -0
- data/golden/chained_fusion/schema.kumi +52 -0
- data/golden/element_arrays/expected/ast.txt +55 -0
- data/golden/element_arrays/expected/input_plan.txt +7 -0
- data/golden/element_arrays/expected/lir_00_unoptimized.txt +81 -0
- data/golden/element_arrays/expected/lir_01_hoist_scalar_references.txt +81 -0
- data/golden/element_arrays/expected/lir_02_inlined.txt +85 -0
- data/golden/element_arrays/expected/lir_03_cse.txt +83 -0
- data/golden/element_arrays/expected/lir_04_1_loop_fusion.txt +83 -0
- data/golden/element_arrays/expected/lir_04_loop_invcm.txt +83 -0
- data/golden/element_arrays/expected/lir_06_const_prop.txt +83 -0
- data/golden/element_arrays/expected/nast.txt +42 -0
- data/golden/element_arrays/expected/schema_javascript.mjs +106 -0
- data/golden/element_arrays/expected/schema_ruby.rb +141 -0
- data/golden/element_arrays/expected/snast.txt +42 -0
- data/golden/element_arrays/expected.json +55 -0
- data/golden/element_arrays/input.json +12 -0
- data/golden/element_arrays/schema.kumi +21 -0
- data/golden/empty_and_null_inputs/expected/ast.txt +42 -0
- data/golden/empty_and_null_inputs/expected/input_plan.txt +12 -0
- data/golden/empty_and_null_inputs/expected/lir_00_unoptimized.txt +31 -0
- data/golden/empty_and_null_inputs/expected/lir_01_hoist_scalar_references.txt +31 -0
- data/golden/empty_and_null_inputs/expected/lir_02_inlined.txt +51 -0
- data/golden/empty_and_null_inputs/expected/lir_03_cse.txt +49 -0
- data/golden/empty_and_null_inputs/expected/lir_04_1_loop_fusion.txt +49 -0
- data/golden/empty_and_null_inputs/expected/lir_04_loop_invcm.txt +49 -0
- data/golden/empty_and_null_inputs/expected/lir_06_const_prop.txt +49 -0
- data/golden/empty_and_null_inputs/expected/nast.txt +18 -0
- data/golden/empty_and_null_inputs/expected/schema_javascript.mjs +47 -0
- data/golden/empty_and_null_inputs/expected/schema_ruby.rb +79 -0
- data/golden/empty_and_null_inputs/expected/snast.txt +18 -0
- data/golden/empty_and_null_inputs/expected.json +8 -0
- data/golden/empty_and_null_inputs/input.json +16 -0
- data/golden/empty_and_null_inputs/schema.kumi +30 -0
- data/golden/game_of_life/expected/ast.txt +118 -0
- data/golden/game_of_life/expected/input_plan.txt +5 -0
- data/golden/game_of_life/expected/lir_00_unoptimized.txt +343 -0
- data/golden/game_of_life/expected/lir_01_hoist_scalar_references.txt +343 -0
- data/golden/game_of_life/expected/lir_02_inlined.txt +1918 -0
- data/golden/game_of_life/expected/lir_03_cse.txt +766 -0
- data/golden/game_of_life/expected/lir_04_1_loop_fusion.txt +766 -0
- data/golden/game_of_life/expected/lir_04_loop_invcm.txt +766 -0
- data/golden/game_of_life/expected/lir_06_const_prop.txt +766 -0
- data/golden/game_of_life/expected/nast.txt +104 -0
- data/golden/game_of_life/expected/schema_javascript.mjs +98 -0
- data/golden/game_of_life/expected/schema_ruby.rb +125 -0
- data/golden/game_of_life/expected/snast.txt +104 -0
- data/golden/game_of_life/expected.json +3 -0
- data/golden/game_of_life/input.json +8 -0
- data/golden/game_of_life/schema.kumi +33 -0
- data/golden/hash_keys/expected/ast.txt +29 -0
- data/golden/hash_keys/expected/input_plan.txt +2 -0
- data/golden/hash_keys/expected/lir_00_unoptimized.txt +18 -0
- data/golden/hash_keys/expected/lir_01_hoist_scalar_references.txt +18 -0
- data/golden/hash_keys/expected/lir_02_inlined.txt +18 -0
- data/golden/hash_keys/expected/lir_03_cse.txt +18 -0
- data/golden/hash_keys/expected/lir_04_1_loop_fusion.txt +18 -0
- data/golden/hash_keys/expected/lir_04_loop_invcm.txt +18 -0
- data/golden/hash_keys/expected/lir_06_const_prop.txt +18 -0
- data/golden/hash_keys/expected/nast.txt +46 -0
- data/golden/hash_keys/expected/schema_javascript.mjs +34 -0
- data/golden/hash_keys/expected/schema_ruby.rb +61 -0
- data/golden/hash_keys/expected/snast.txt +46 -0
- data/golden/hash_keys/expected.json +20 -0
- data/golden/hash_keys/input.json +4 -0
- data/golden/hash_keys/schema.kumi +14 -0
- data/golden/hash_value/expected/ast.txt +37 -0
- data/golden/hash_value/expected/input_plan.txt +7 -0
- data/golden/hash_value/expected/lir_00_unoptimized.txt +30 -0
- data/golden/hash_value/expected/lir_01_hoist_scalar_references.txt +30 -0
- data/golden/hash_value/expected/lir_02_inlined.txt +36 -0
- data/golden/hash_value/expected/lir_03_cse.txt +33 -0
- data/golden/hash_value/expected/lir_04_1_loop_fusion.txt +33 -0
- data/golden/hash_value/expected/lir_04_loop_invcm.txt +33 -0
- data/golden/hash_value/expected/lir_06_const_prop.txt +33 -0
- data/golden/hash_value/expected/nast.txt +25 -0
- data/golden/hash_value/expected/schema_javascript.mjs +46 -0
- data/golden/hash_value/expected/schema_ruby.rb +75 -0
- data/golden/hash_value/expected/snast.txt +25 -0
- data/golden/hash_value/expected.json +19 -0
- data/golden/hash_value/input.json +12 -0
- data/golden/hash_value/schema.kumi +19 -0
- data/golden/hierarchical_complex/expected/ast.txt +85 -0
- data/golden/hierarchical_complex/expected/input_plan.txt +23 -0
- data/golden/hierarchical_complex/expected/lir_00_unoptimized.txt +87 -0
- data/golden/hierarchical_complex/expected/lir_01_hoist_scalar_references.txt +87 -0
- data/golden/hierarchical_complex/expected/lir_02_inlined.txt +115 -0
- data/golden/hierarchical_complex/expected/lir_03_cse.txt +89 -0
- data/golden/hierarchical_complex/expected/lir_04_1_loop_fusion.txt +89 -0
- data/golden/hierarchical_complex/expected/lir_04_loop_invcm.txt +89 -0
- data/golden/hierarchical_complex/expected/lir_06_const_prop.txt +89 -0
- data/golden/hierarchical_complex/expected/nast.txt +49 -0
- data/golden/hierarchical_complex/expected/schema_javascript.mjs +121 -0
- data/golden/hierarchical_complex/expected/schema_ruby.rb +151 -0
- data/golden/hierarchical_complex/expected/snast.txt +49 -0
- data/golden/hierarchical_complex/expected.json +34 -0
- data/golden/hierarchical_complex/input.json +26 -0
- data/golden/hierarchical_complex/schema.kumi +38 -0
- data/golden/input_reference/expected/ast.txt +46 -0
- data/golden/input_reference/expected/input_plan.txt +15 -0
- data/golden/input_reference/expected/lir_00_unoptimized.txt +39 -0
- data/golden/input_reference/expected/lir_01_hoist_scalar_references.txt +39 -0
- data/golden/input_reference/expected/lir_02_inlined.txt +39 -0
- data/golden/input_reference/expected/lir_03_cse.txt +39 -0
- data/golden/input_reference/expected/lir_04_1_loop_fusion.txt +39 -0
- data/golden/input_reference/expected/lir_04_loop_invcm.txt +39 -0
- data/golden/input_reference/expected/lir_06_const_prop.txt +39 -0
- data/golden/input_reference/expected/nast.txt +21 -0
- data/golden/input_reference/expected/schema_javascript.mjs +45 -0
- data/golden/input_reference/expected/schema_ruby.rb +74 -0
- data/golden/input_reference/expected/snast.txt +21 -0
- data/golden/input_reference/expected.json +7 -0
- data/golden/input_reference/input.json +11 -0
- data/golden/input_reference/schema.kumi +22 -0
- data/golden/interleaved_fusion/expected/ast.txt +51 -0
- data/golden/interleaved_fusion/expected/input_plan.txt +13 -0
- data/golden/interleaved_fusion/expected/lir_00_unoptimized.txt +53 -0
- data/golden/interleaved_fusion/expected/lir_01_hoist_scalar_references.txt +53 -0
- data/golden/interleaved_fusion/expected/lir_02_inlined.txt +89 -0
- data/golden/interleaved_fusion/expected/lir_03_cse.txt +77 -0
- data/golden/interleaved_fusion/expected/lir_04_1_loop_fusion.txt +77 -0
- data/golden/interleaved_fusion/expected/lir_04_loop_invcm.txt +77 -0
- data/golden/interleaved_fusion/expected/lir_06_const_prop.txt +77 -0
- data/golden/interleaved_fusion/expected/nast.txt +41 -0
- data/golden/interleaved_fusion/expected/schema_javascript.mjs +86 -0
- data/golden/interleaved_fusion/expected/schema_ruby.rb +122 -0
- data/golden/interleaved_fusion/expected/snast.txt +41 -0
- data/golden/interleaved_fusion/expected.json +37 -0
- data/golden/interleaved_fusion/input.json +26 -0
- data/golden/interleaved_fusion/schema.kumi +57 -0
- data/golden/let_inline/expected/ast.txt +33 -0
- data/golden/let_inline/expected/input_plan.txt +2 -0
- data/golden/let_inline/expected/lir_00_unoptimized.txt +26 -0
- data/golden/let_inline/expected/lir_01_hoist_scalar_references.txt +26 -0
- data/golden/let_inline/expected/lir_02_inlined.txt +36 -0
- data/golden/let_inline/expected/lir_03_cse.txt +30 -0
- data/golden/let_inline/expected/lir_04_1_loop_fusion.txt +30 -0
- data/golden/let_inline/expected/lir_04_loop_invcm.txt +30 -0
- data/golden/let_inline/expected/lir_06_const_prop.txt +30 -0
- data/golden/let_inline/expected/nast.txt +26 -0
- data/golden/let_inline/expected/schema_javascript.mjs +11 -0
- data/golden/let_inline/expected/schema_ruby.rb +37 -0
- data/golden/let_inline/expected/snast.txt +26 -0
- data/golden/let_inline/expected.json +1 -0
- data/golden/let_inline/input.json +1 -0
- data/golden/let_inline/schema.kumi +11 -0
- data/golden/loop_fusion/expected/ast.txt +44 -0
- data/golden/loop_fusion/expected/input_plan.txt +13 -0
- data/golden/loop_fusion/expected/lir_00_unoptimized.txt +43 -0
- data/golden/loop_fusion/expected/lir_01_hoist_scalar_references.txt +43 -0
- data/golden/loop_fusion/expected/lir_02_inlined.txt +62 -0
- data/golden/loop_fusion/expected/lir_03_cse.txt +57 -0
- data/golden/loop_fusion/expected/lir_04_1_loop_fusion.txt +57 -0
- data/golden/loop_fusion/expected/lir_04_loop_invcm.txt +57 -0
- data/golden/loop_fusion/expected/lir_06_const_prop.txt +57 -0
- data/golden/loop_fusion/expected/nast.txt +32 -0
- data/golden/loop_fusion/expected/schema_javascript.mjs +64 -0
- data/golden/loop_fusion/expected/schema_ruby.rb +97 -0
- data/golden/loop_fusion/expected/snast.txt +32 -0
- data/golden/loop_fusion/expected.json +30 -0
- data/golden/loop_fusion/input.json +28 -0
- data/golden/loop_fusion/schema.kumi +32 -0
- data/golden/min_reduce_scope/expected/ast.txt +49 -0
- data/golden/min_reduce_scope/expected/input_plan.txt +9 -0
- data/golden/min_reduce_scope/expected/lir_00_unoptimized.txt +59 -0
- data/golden/min_reduce_scope/expected/lir_01_hoist_scalar_references.txt +59 -0
- data/golden/min_reduce_scope/expected/lir_02_inlined.txt +63 -0
- data/golden/min_reduce_scope/expected/lir_03_cse.txt +60 -0
- data/golden/min_reduce_scope/expected/lir_04_1_loop_fusion.txt +60 -0
- data/golden/min_reduce_scope/expected/lir_04_loop_invcm.txt +60 -0
- data/golden/min_reduce_scope/expected/lir_06_const_prop.txt +60 -0
- data/golden/min_reduce_scope/expected/nast.txt +29 -0
- data/golden/min_reduce_scope/expected/schema_javascript.mjs +66 -0
- data/golden/min_reduce_scope/expected/schema_ruby.rb +99 -0
- data/golden/min_reduce_scope/expected/snast.txt +29 -0
- data/golden/min_reduce_scope/expected.json +9 -0
- data/golden/min_reduce_scope/input.json +18 -0
- data/golden/min_reduce_scope/schema.kumi +25 -0
- data/golden/mixed_dimensions/expected/ast.txt +54 -0
- data/golden/mixed_dimensions/expected/input_plan.txt +15 -0
- data/golden/mixed_dimensions/expected/lir_00_unoptimized.txt +42 -0
- data/golden/mixed_dimensions/expected/lir_01_hoist_scalar_references.txt +42 -0
- data/golden/mixed_dimensions/expected/lir_02_inlined.txt +48 -0
- data/golden/mixed_dimensions/expected/lir_03_cse.txt +48 -0
- data/golden/mixed_dimensions/expected/lir_04_1_loop_fusion.txt +48 -0
- data/golden/mixed_dimensions/expected/lir_04_loop_invcm.txt +48 -0
- data/golden/mixed_dimensions/expected/lir_06_const_prop.txt +48 -0
- data/golden/mixed_dimensions/expected/nast.txt +22 -0
- data/golden/mixed_dimensions/expected/schema_javascript.mjs +53 -0
- data/golden/mixed_dimensions/expected/schema_ruby.rb +84 -0
- data/golden/mixed_dimensions/expected/snast.txt +22 -0
- data/golden/mixed_dimensions/expected.json +6 -0
- data/golden/mixed_dimensions/input.json +22 -0
- data/golden/mixed_dimensions/schema.kumi +35 -0
- data/golden/multirank_hoisting/expected/ast.txt +72 -0
- data/golden/multirank_hoisting/expected/input_plan.txt +18 -0
- data/golden/multirank_hoisting/expected/lir_00_unoptimized.txt +75 -0
- data/golden/multirank_hoisting/expected/lir_01_hoist_scalar_references.txt +75 -0
- data/golden/multirank_hoisting/expected/lir_02_inlined.txt +126 -0
- data/golden/multirank_hoisting/expected/lir_03_cse.txt +109 -0
- data/golden/multirank_hoisting/expected/lir_04_1_loop_fusion.txt +109 -0
- data/golden/multirank_hoisting/expected/lir_04_loop_invcm.txt +109 -0
- data/golden/multirank_hoisting/expected/lir_06_const_prop.txt +109 -0
- data/golden/multirank_hoisting/expected/nast.txt +39 -0
- data/golden/multirank_hoisting/expected/schema_javascript.mjs +128 -0
- data/golden/multirank_hoisting/expected/schema_ruby.rb +162 -0
- data/golden/multirank_hoisting/expected/snast.txt +39 -0
- data/golden/multirank_hoisting/expected.json +15 -0
- data/golden/multirank_hoisting/input.json +19 -0
- data/golden/multirank_hoisting/schema.kumi +38 -0
- data/golden/nested_hash/expected/ast.txt +22 -0
- data/golden/nested_hash/expected/input_plan.txt +5 -0
- data/golden/nested_hash/expected/lir_00_unoptimized.txt +10 -0
- data/golden/nested_hash/expected/lir_01_hoist_scalar_references.txt +10 -0
- data/golden/nested_hash/expected/lir_02_inlined.txt +10 -0
- data/golden/nested_hash/expected/lir_03_cse.txt +10 -0
- data/golden/nested_hash/expected/lir_04_1_loop_fusion.txt +10 -0
- data/golden/nested_hash/expected/lir_04_loop_invcm.txt +10 -0
- data/golden/nested_hash/expected/lir_06_const_prop.txt +10 -0
- data/golden/nested_hash/expected/nast.txt +8 -0
- data/golden/nested_hash/expected/schema_javascript.mjs +9 -0
- data/golden/nested_hash/expected/schema_ruby.rb +35 -0
- data/golden/nested_hash/expected/snast.txt +8 -0
- data/golden/nested_hash/expected.json +3 -0
- data/golden/nested_hash/input.json +7 -0
- data/golden/nested_hash/schema.kumi +11 -0
- data/golden/reduction_broadcast/expected/ast.txt +49 -0
- data/golden/reduction_broadcast/expected/input_plan.txt +13 -0
- data/golden/reduction_broadcast/expected/lir_00_unoptimized.txt +49 -0
- data/golden/reduction_broadcast/expected/lir_01_hoist_scalar_references.txt +49 -0
- data/golden/reduction_broadcast/expected/lir_02_inlined.txt +80 -0
- data/golden/reduction_broadcast/expected/lir_03_cse.txt +68 -0
- data/golden/reduction_broadcast/expected/lir_04_1_loop_fusion.txt +68 -0
- data/golden/reduction_broadcast/expected/lir_04_loop_invcm.txt +68 -0
- data/golden/reduction_broadcast/expected/lir_06_const_prop.txt +68 -0
- data/golden/reduction_broadcast/expected/nast.txt +24 -0
- data/golden/reduction_broadcast/expected/schema_javascript.mjs +74 -0
- data/golden/reduction_broadcast/expected/schema_ruby.rb +110 -0
- data/golden/reduction_broadcast/expected/snast.txt +24 -0
- data/golden/reduction_broadcast/expected.json +25 -0
- data/golden/reduction_broadcast/input.json +19 -0
- data/golden/reduction_broadcast/schema.kumi +34 -0
- data/golden/roll/expected/ast.txt +36 -0
- data/golden/roll/expected/input_plan.txt +3 -0
- data/golden/roll/expected/lir_00_unoptimized.txt +56 -0
- data/golden/roll/expected/lir_01_hoist_scalar_references.txt +56 -0
- data/golden/roll/expected/lir_02_inlined.txt +56 -0
- data/golden/roll/expected/lir_03_cse.txt +55 -0
- data/golden/roll/expected/lir_04_1_loop_fusion.txt +55 -0
- data/golden/roll/expected/lir_04_loop_invcm.txt +55 -0
- data/golden/roll/expected/lir_06_const_prop.txt +55 -0
- data/golden/roll/expected/nast.txt +26 -0
- data/golden/roll/expected/schema_javascript.mjs +65 -0
- data/golden/roll/expected/schema_ruby.rb +95 -0
- data/golden/roll/expected/snast.txt +26 -0
- data/golden/roll/expected.json +6 -0
- data/golden/roll/input.json +1 -0
- data/golden/roll/schema.kumi +13 -0
- data/golden/shift/expected/ast.txt +48 -0
- data/golden/shift/expected/input_plan.txt +3 -0
- data/golden/shift/expected/lir_00_unoptimized.txt +96 -0
- data/golden/shift/expected/lir_01_hoist_scalar_references.txt +96 -0
- data/golden/shift/expected/lir_02_inlined.txt +96 -0
- data/golden/shift/expected/lir_03_cse.txt +90 -0
- data/golden/shift/expected/lir_04_1_loop_fusion.txt +90 -0
- data/golden/shift/expected/lir_04_loop_invcm.txt +90 -0
- data/golden/shift/expected/lir_06_const_prop.txt +90 -0
- data/golden/shift/expected/nast.txt +38 -0
- data/golden/shift/expected/schema_javascript.mjs +106 -0
- data/golden/shift/expected/schema_ruby.rb +138 -0
- data/golden/shift/expected/snast.txt +38 -0
- data/golden/shift/expected.json +8 -0
- data/golden/shift/input.json +1 -0
- data/golden/shift/schema.kumi +15 -0
- data/golden/shift_2d/expected/ast.txt +88 -0
- data/golden/shift_2d/expected/input_plan.txt +5 -0
- data/golden/shift_2d/expected/lir_00_unoptimized.txt +274 -0
- data/golden/shift_2d/expected/lir_01_hoist_scalar_references.txt +274 -0
- data/golden/shift_2d/expected/lir_02_inlined.txt +274 -0
- data/golden/shift_2d/expected/lir_03_cse.txt +262 -0
- data/golden/shift_2d/expected/lir_04_1_loop_fusion.txt +262 -0
- data/golden/shift_2d/expected/lir_04_loop_invcm.txt +262 -0
- data/golden/shift_2d/expected/lir_06_const_prop.txt +262 -0
- data/golden/shift_2d/expected/nast.txt +74 -0
- data/golden/shift_2d/expected/schema_javascript.mjs +320 -0
- data/golden/shift_2d/expected/schema_ruby.rb +358 -0
- data/golden/shift_2d/expected/snast.txt +74 -0
- data/golden/shift_2d/expected.json +15 -0
- data/golden/shift_2d/input.json +14 -0
- data/golden/shift_2d/schema.kumi +25 -0
- data/golden/simple_math/expected/ast.txt +40 -0
- data/golden/simple_math/expected/input_plan.txt +2 -0
- data/golden/simple_math/expected/lir_00_unoptimized.txt +31 -0
- data/golden/simple_math/expected/lir_01_hoist_scalar_references.txt +31 -0
- data/golden/simple_math/expected/lir_02_inlined.txt +31 -0
- data/golden/simple_math/expected/lir_03_cse.txt +31 -0
- data/golden/simple_math/expected/lir_04_1_loop_fusion.txt +31 -0
- data/golden/simple_math/expected/lir_04_loop_invcm.txt +31 -0
- data/golden/simple_math/expected/lir_06_const_prop.txt +31 -0
- data/golden/simple_math/expected/nast.txt +33 -0
- data/golden/simple_math/expected/schema_javascript.mjs +33 -0
- data/golden/simple_math/expected/schema_ruby.rb +59 -0
- data/golden/simple_math/expected/snast.txt +33 -0
- data/golden/simple_math/expected.json +1 -0
- data/golden/simple_math/input.json +4 -0
- data/golden/simple_math/schema.kumi +2 -1
- data/golden/streaming_basics/expected/ast.txt +64 -0
- data/golden/streaming_basics/expected/input_plan.txt +8 -0
- data/golden/streaming_basics/expected/lir_00_unoptimized.txt +73 -0
- data/golden/streaming_basics/expected/lir_01_hoist_scalar_references.txt +73 -0
- data/golden/streaming_basics/expected/lir_02_inlined.txt +100 -0
- data/golden/streaming_basics/expected/lir_03_cse.txt +84 -0
- data/golden/streaming_basics/expected/lir_04_1_loop_fusion.txt +84 -0
- data/golden/streaming_basics/expected/lir_04_loop_invcm.txt +84 -0
- data/golden/streaming_basics/expected/lir_06_const_prop.txt +84 -0
- data/golden/streaming_basics/expected/nast.txt +48 -0
- data/golden/streaming_basics/expected/schema_javascript.mjs +94 -0
- data/golden/streaming_basics/expected/schema_ruby.rb +127 -0
- data/golden/streaming_basics/expected/snast.txt +48 -0
- data/golden/streaming_basics/expected.json +10 -0
- data/golden/streaming_basics/input.json +8 -0
- data/golden/streaming_basics/schema.kumi +24 -0
- data/golden/tuples/expected/ast.txt +48 -0
- data/golden/tuples/expected/input_plan.txt +1 -0
- data/golden/tuples/expected/lir_00_unoptimized.txt +40 -0
- data/golden/tuples/expected/lir_01_hoist_scalar_references.txt +40 -0
- data/golden/tuples/expected/lir_02_inlined.txt +48 -0
- data/golden/tuples/expected/lir_03_cse.txt +48 -0
- data/golden/tuples/expected/lir_04_1_loop_fusion.txt +48 -0
- data/golden/tuples/expected/lir_04_loop_invcm.txt +48 -0
- data/golden/tuples/expected/lir_06_const_prop.txt +48 -0
- data/golden/tuples/expected/nast.txt +42 -0
- data/golden/tuples/expected/schema_javascript.mjs +51 -0
- data/golden/tuples/expected/schema_ruby.rb +77 -0
- data/golden/tuples/expected/snast.txt +42 -0
- data/golden/tuples/expected.json +7 -0
- data/golden/tuples/input.json +3 -0
- data/golden/tuples/schema.kumi +11 -0
- data/golden/tuples_and_arrays/expected/ast.txt +44 -0
- data/golden/tuples_and_arrays/expected/input_plan.txt +7 -0
- data/golden/tuples_and_arrays/expected/lir_00_unoptimized.txt +41 -0
- data/golden/tuples_and_arrays/expected/lir_01_hoist_scalar_references.txt +41 -0
- data/golden/tuples_and_arrays/expected/lir_02_inlined.txt +62 -0
- data/golden/tuples_and_arrays/expected/lir_03_cse.txt +51 -0
- data/golden/tuples_and_arrays/expected/lir_04_1_loop_fusion.txt +51 -0
- data/golden/tuples_and_arrays/expected/lir_04_loop_invcm.txt +51 -0
- data/golden/tuples_and_arrays/expected/lir_06_const_prop.txt +51 -0
- data/golden/tuples_and_arrays/expected/nast.txt +28 -0
- data/golden/tuples_and_arrays/expected/schema_javascript.mjs +58 -0
- data/golden/tuples_and_arrays/expected/schema_ruby.rb +88 -0
- data/golden/tuples_and_arrays/expected/snast.txt +28 -0
- data/golden/tuples_and_arrays/expected.json +18 -0
- data/golden/tuples_and_arrays/input.json +7 -0
- data/golden/tuples_and_arrays/schema.kumi +38 -0
- data/golden/with_constants/expected/ast.txt +28 -0
- data/golden/with_constants/expected/input_plan.txt +2 -0
- data/golden/with_constants/expected/lir_00_unoptimized.txt +17 -0
- data/golden/with_constants/expected/lir_01_hoist_scalar_references.txt +17 -0
- data/golden/with_constants/expected/lir_02_inlined.txt +17 -0
- data/golden/with_constants/expected/lir_03_cse.txt +17 -0
- data/golden/with_constants/expected/lir_04_1_loop_fusion.txt +17 -0
- data/golden/with_constants/expected/lir_04_loop_invcm.txt +17 -0
- data/golden/with_constants/expected/lir_06_const_prop.txt +17 -0
- data/golden/with_constants/expected/nast.txt +21 -0
- data/golden/with_constants/expected/schema_javascript.mjs +18 -0
- data/golden/with_constants/expected/schema_ruby.rb +44 -0
- data/golden/with_constants/expected/snast.txt +15 -0
- data/golden/with_constants/schema.kumi +10 -0
- data/lib/kumi/analyzer.rb +76 -24
- data/lib/kumi/configuration.rb +60 -0
- data/lib/kumi/core/analyzer/binder.rb +121 -0
- data/lib/kumi/core/analyzer/checkpoint.rb +15 -9
- data/lib/kumi/core/analyzer/constant_evaluator.rb +32 -37
- data/lib/kumi/core/analyzer/constant_folding_helpers.rb +55 -0
- data/lib/kumi/core/analyzer/debug.rb +14 -16
- data/lib/kumi/core/analyzer/fn_aliases.rb +46 -0
- data/lib/kumi/core/analyzer/folder.rb +94 -0
- data/lib/kumi/core/analyzer/macro_expander.rb +69 -0
- data/lib/kumi/core/analyzer/passes/assemble_irv2_pass.rb +130 -0
- data/lib/kumi/core/analyzer/passes/attach_anchors_pass.rb +71 -0
- data/lib/kumi/core/analyzer/passes/attach_terminal_info_pass.rb +181 -0
- data/lib/kumi/core/analyzer/passes/codegen/js/declaration_emitter.rb +317 -0
- data/lib/kumi/core/analyzer/passes/codegen/js/emitter.rb +75 -0
- data/lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb +103 -0
- data/lib/kumi/core/analyzer/passes/codegen/js_pass.rb +27 -0
- data/lib/kumi/core/analyzer/passes/codegen/ruby/declaration_emitter.rb +321 -0
- data/lib/kumi/core/analyzer/passes/codegen/ruby/emitter.rb +85 -0
- data/lib/kumi/core/analyzer/passes/codegen/ruby/output_buffer.rb +111 -0
- data/lib/kumi/core/analyzer/passes/codegen/ruby_pass.rb +32 -0
- data/lib/kumi/core/analyzer/passes/constant_folding_pass.rb +33 -0
- data/lib/kumi/core/analyzer/passes/contract_checker_pass.rb +220 -0
- data/lib/kumi/core/analyzer/passes/dependency_resolver.rb +5 -6
- data/lib/kumi/core/analyzer/passes/input_access_planner_pass.rb +7 -3
- data/lib/kumi/core/analyzer/passes/input_collector.rb +74 -122
- data/lib/kumi/core/analyzer/passes/input_form_schema_pass.rb +43 -0
- data/lib/kumi/core/analyzer/passes/ir_dependency_pass.rb +1 -1
- data/lib/kumi/core/analyzer/passes/ir_execution_schedule_pass.rb +1 -1
- data/lib/kumi/core/analyzer/passes/join_reduce_planning_pass.rb +21 -23
- data/lib/kumi/core/analyzer/passes/lir/constant_propagation_pass.rb +84 -0
- data/lib/kumi/core/analyzer/passes/lir/dead_code_elimination_pass.rb +93 -0
- data/lib/kumi/core/analyzer/passes/lir/hoist_scalar_references_pass.rb +115 -0
- data/lib/kumi/core/analyzer/passes/lir/inline_declarations_pass.rb +274 -0
- data/lib/kumi/core/analyzer/passes/lir/instruction_scheduling_pass.rb +198 -0
- data/lib/kumi/core/analyzer/passes/lir/kernel_binding_pass.rb +30 -0
- data/lib/kumi/core/analyzer/passes/lir/local_cse_pass.rb +121 -0
- data/lib/kumi/core/analyzer/passes/lir/loop_fusion_pass.rb +156 -0
- data/lib/kumi/core/analyzer/passes/lir/loop_invariant_code_motion_pass.rb +148 -0
- data/lib/kumi/core/analyzer/passes/lir/lower_pass.rb +407 -0
- data/lib/kumi/core/analyzer/passes/lir/stencil_emitter.rb +243 -0
- data/lib/kumi/core/analyzer/passes/lir/validation_pass.rb +83 -0
- data/lib/kumi/core/analyzer/passes/load_input_cse.rb +17 -16
- data/lib/kumi/core/analyzer/passes/lower_to_ir_pass.rb +4 -2
- data/lib/kumi/core/analyzer/passes/lower_to_irv2_pass.rb +197 -0
- data/lib/kumi/core/analyzer/passes/name_indexer.rb +4 -1
- data/lib/kumi/core/analyzer/passes/nast_dimensional_analyzer_pass.rb +237 -0
- data/lib/kumi/core/analyzer/passes/normalize_to_nast_pass.rb +156 -0
- data/lib/kumi/core/analyzer/passes/output_schema_pass.rb +38 -0
- data/lib/kumi/core/analyzer/passes/pass_base.rb +30 -4
- data/lib/kumi/core/analyzer/passes/precompute_access_paths_pass.rb +93 -0
- data/lib/kumi/core/analyzer/passes/scope_resolution_pass.rb +33 -30
- data/lib/kumi/core/analyzer/passes/semantic_constraint_validator.rb +5 -26
- data/lib/kumi/core/analyzer/passes/snast_pass.rb +229 -0
- data/lib/kumi/core/analyzer/passes/toposorter.rb +1 -0
- data/lib/kumi/core/analyzer/passes/type_checker.rb +13 -0
- data/lib/kumi/core/analyzer/passes/type_inferencer_pass.rb +14 -16
- data/lib/kumi/core/analyzer/passes/unsat_detector.rb +2 -1
- data/lib/kumi/core/analyzer/plans.rb +12 -0
- data/lib/kumi/core/analyzer/state_serde.rb +4 -4
- data/lib/kumi/core/analyzer/structs/access_plan.rb +2 -2
- data/lib/kumi/core/analyzer/unsat_constant_evaluator.rb +59 -0
- data/lib/kumi/core/compiler/access_codegen.rb +1 -1
- data/lib/kumi/core/compiler/access_emit/base.rb +9 -5
- data/lib/kumi/core/compiler/access_emit/each_indexed.rb +10 -3
- data/lib/kumi/core/compiler/access_emit/materialize.rb +12 -5
- data/lib/kumi/core/compiler/access_emit/ravel.rb +10 -3
- data/lib/kumi/core/compiler/access_emit/read.rb +4 -1
- data/lib/kumi/core/compiler/access_planner.rb +42 -4
- data/lib/kumi/core/compiler/access_planner_v2.rb +164 -0
- data/lib/kumi/core/explain.rb +18 -11
- data/lib/kumi/core/functions/loader.rb +47 -0
- data/lib/kumi/core/functions/model.rb +10 -0
- data/lib/kumi/core/functions/type_rules.rb +108 -0
- data/lib/kumi/core/ir/execution_engine/interpreter.rb +1 -1
- data/lib/kumi/core/ir/execution_engine/profiler.rb +107 -97
- data/lib/kumi/core/ir.rb +6 -2
- data/lib/kumi/core/irv2/builder.rb +48 -0
- data/lib/kumi/core/irv2/declaration.rb +28 -0
- data/lib/kumi/core/irv2/module.rb +108 -0
- data/lib/kumi/core/irv2/value.rb +28 -0
- data/lib/kumi/core/lir/analyze.rb +64 -0
- data/lib/kumi/core/lir/build.rb +363 -0
- data/lib/kumi/core/lir/emit.rb +62 -0
- data/lib/kumi/core/lir/structs/instruction.rb +44 -0
- data/lib/kumi/core/lir/structs/literal.rb +14 -0
- data/lib/kumi/core/lir/structs/stamp.rb +13 -0
- data/lib/kumi/core/lir/support/error.rb +9 -0
- data/lib/kumi/core/lir/support/ids.rb +34 -0
- data/lib/kumi/core/lir/validate.rb +74 -0
- data/lib/kumi/core/lir.rb +34 -0
- data/lib/kumi/core/nast.rb +216 -0
- data/lib/kumi/core/ruby_parser/dsl.rb +2 -2
- data/lib/kumi/core/ruby_parser/dsl_cascade_builder.rb +1 -1
- data/lib/kumi/core/ruby_parser/expression_converter.rb +10 -0
- data/lib/kumi/core/ruby_parser/input_builder.rb +16 -17
- data/lib/kumi/core/ruby_parser/schema_builder.rb +36 -10
- data/lib/kumi/core/ruby_parser/sugar.rb +64 -0
- data/lib/kumi/core/types/builder.rb +2 -2
- data/lib/kumi/core/types/normalizer.rb +2 -0
- data/lib/kumi/core/types/validator.rb +10 -3
- data/lib/kumi/core/types.rb +7 -0
- data/lib/kumi/dev/codegen.rb +194 -0
- data/lib/kumi/dev/golden/generator.rb +105 -0
- data/lib/kumi/dev/golden/reporter.rb +160 -0
- data/lib/kumi/dev/golden/representation.rb +45 -0
- data/lib/kumi/dev/golden/result.rb +98 -0
- data/lib/kumi/dev/golden/runtime_test.rb +93 -0
- data/lib/kumi/dev/golden/suite.rb +131 -0
- data/lib/kumi/dev/golden/verifier.rb +76 -0
- data/lib/kumi/dev/golden.rb +75 -0
- data/lib/kumi/dev/ir.rb +4 -4
- data/lib/kumi/dev/parse.rb +1 -1
- data/lib/kumi/dev/pretty_printer.rb +229 -0
- data/lib/kumi/dev/printer/irv2_formatter.rb +163 -0
- data/lib/kumi/dev/printer/width_aware_json.rb +44 -0
- data/lib/kumi/dev/profile_aggregator.rb +36 -38
- data/lib/kumi/dev/profile_runner.rb +19 -23
- data/lib/kumi/dev/runner.rb +12 -22
- data/lib/kumi/dev/support/kumi_runner.mjs +39 -0
- data/lib/kumi/dev.rb +3 -3
- data/lib/kumi/frontends/ruby.rb +12 -12
- data/lib/kumi/frontends/text.rb +26 -21
- data/lib/kumi/frontends.rb +6 -8
- data/lib/kumi/kernel_registry.rb +59 -0
- data/lib/kumi/pack/builder.rb +229 -0
- data/lib/kumi/pack.rb +15 -0
- data/lib/kumi/registry_v2/loader.rb +81 -0
- data/lib/kumi/registry_v2.rb +118 -0
- data/lib/kumi/schema.rb +83 -43
- data/lib/kumi/support/diff.rb +3 -2
- data/lib/kumi/support/ir_render.rb +1 -1
- data/lib/kumi/support/lir_printer.rb +143 -0
- data/lib/kumi/support/nast_printer.rb +93 -0
- data/lib/kumi/support/s_expression_printer.rb +5 -4
- data/lib/kumi/support/snast_printer.rb +111 -0
- data/lib/kumi/syntax/call_expression.rb +1 -1
- data/lib/kumi/syntax/input_declaration.rb +2 -2
- data/lib/kumi/syntax/node.rb +4 -12
- data/lib/kumi/syntax/root.rb +10 -0
- data/lib/kumi/syntax/trait_declaration.rb +1 -0
- data/lib/kumi/syntax/value_declaration.rb +1 -0
- data/lib/kumi/version.rb +1 -1
- data/lib/kumi.rb +47 -5
- metadata +571 -54
- data/docs/AST.md +0 -133
- data/docs/DSL.md +0 -154
- data/docs/FUNCTIONS.md +0 -176
- data/docs/VECTOR_SEMANTICS.md +0 -286
- data/docs/compiler_design_principles.md +0 -86
- data/docs/dev/analyzer-debug.md +0 -52
- data/docs/dev/parse-command.md +0 -64
- data/docs/dev/vm-profiling.md +0 -95
- data/docs/development/README.md +0 -120
- data/docs/development/error-reporting.md +0 -361
- data/docs/features/README.md +0 -58
- data/docs/features/analysis-type-inference.md +0 -42
- data/docs/features/analysis-unsat-detection.md +0 -71
- data/docs/features/hierarchical-broadcasting.md +0 -415
- data/docs/features/input-declaration-system.md +0 -58
- data/docs/features/performance.md +0 -14
- data/docs/features/s-expression-printer.md +0 -77
- data/docs/schema_metadata/broadcasts.md +0 -53
- data/docs/schema_metadata/cascades.md +0 -45
- data/docs/schema_metadata/declarations.md +0 -54
- data/docs/schema_metadata/dependencies.md +0 -57
- data/docs/schema_metadata/evaluation_order.md +0 -29
- data/docs/schema_metadata/examples.md +0 -95
- data/docs/schema_metadata/inferred_types.md +0 -46
- data/docs/schema_metadata/inputs.md +0 -86
- data/docs/schema_metadata.md +0 -108
- data/golden/mixed_nesting/schema.kumi +0 -42
- data/lib/kumi/core/function_registry/collection_functions.rb +0 -298
- data/lib/kumi/core/function_registry/comparison_functions.rb +0 -33
- data/lib/kumi/core/function_registry/conditional_functions.rb +0 -48
- data/lib/kumi/core/function_registry/function_builder.rb +0 -184
- data/lib/kumi/core/function_registry/logical_functions.rb +0 -214
- data/lib/kumi/core/function_registry/math_functions.rb +0 -74
- data/lib/kumi/core/function_registry/stat_functions.rb +0 -156
- data/lib/kumi/core/function_registry/string_functions.rb +0 -57
- data/lib/kumi/core/function_registry/type_functions.rb +0 -53
- data/lib/kumi/core/function_registry.rb +0 -176
- data/lib/kumi/registry.rb +0 -32
- data/lib/kumi/runtime/executable.rb +0 -135
- data/lib/kumi/runtime/run.rb +0 -105
- data/performance_results.txt +0 -63
- data/scripts/analyze_broadcast_methods.rb +0 -68
- data/scripts/analyze_cascade_methods.rb +0 -74
- data/scripts/check_broadcasting_coverage.rb +0 -51
- data/scripts/find_dead_code.rb +0 -114
- data/scripts/generate_function_docs.rb +0 -71
- data/scripts/test_mixed_nesting_performance.rb +0 -206
data/docs/AST.md
DELETED
@@ -1,133 +0,0 @@
|
|
1
|
-
# Kumi AST Reference
|
2
|
-
|
3
|
-
## Core Node Types
|
4
|
-
|
5
|
-
**Root**: Schema container
|
6
|
-
```ruby
|
7
|
-
Root = Struct.new(:inputs, :attributes, :traits)
|
8
|
-
```
|
9
|
-
|
10
|
-
**InputDeclaration**: Input field metadata
|
11
|
-
```ruby
|
12
|
-
InputDeclaration = Struct.new(:name, :domain, :type)
|
13
|
-
# DSL: integer :age, domain: 18..65 → InputDeclaration(:age, 18..65, :integer)
|
14
|
-
```
|
15
|
-
|
16
|
-
**TraitDeclaration**: Boolean predicate
|
17
|
-
```ruby
|
18
|
-
TraitDeclaration = Struct.new(:name, :expression)
|
19
|
-
# DSL: trait :adult, (input.age >= 18) → TraitDeclaration(:adult, CallExpression(...))
|
20
|
-
```
|
21
|
-
|
22
|
-
**ValueDeclaration**: Computed value
|
23
|
-
```ruby
|
24
|
-
ValueDeclaration = Struct.new(:name, :expression)
|
25
|
-
# DSL: value :total, fn(:add, a, b) → ValueDeclaration(:total, CallExpression(:add, [...]))
|
26
|
-
```
|
27
|
-
|
28
|
-
## Expression Nodes
|
29
|
-
|
30
|
-
**CallExpression**: Function calls and operators
|
31
|
-
```ruby
|
32
|
-
CallExpression = Struct.new(:fn_name, :args)
|
33
|
-
def &(other) = CallExpression.new(:and, [self, other]) # Enable chaining
|
34
|
-
```
|
35
|
-
|
36
|
-
**InputReference**: Field access (`input.field_name`)
|
37
|
-
```ruby
|
38
|
-
InputReference = Struct.new(:name)
|
39
|
-
# Has operator methods: >=, <=, >, <, ==, != that create CallExpression nodes
|
40
|
-
```
|
41
|
-
|
42
|
-
**InputElementReference**: Access of nested input fields (`input.field_name.element.subelement.subsubelement`)
|
43
|
-
```ruby
|
44
|
-
InputElementReference = Struct.new(:path)
|
45
|
-
# Represents nested input access
|
46
|
-
# DSL: input.address.street → InputElementReference([:address, :street])
|
47
|
-
```
|
48
|
-
|
49
|
-
**DeclarationReference**: References to other declarations
|
50
|
-
```ruby
|
51
|
-
DeclarationReference = Struct.new(:name)
|
52
|
-
# Created by: ref(:name) OR bare identifier (trait_name) in composite traits
|
53
|
-
# DSL: ref(:adult) → DeclarationReference(:adult)
|
54
|
-
# DSL: adult & verified → CallExpression(:and, [DeclarationReference(:adult), DeclarationReference(:verified)])
|
55
|
-
```
|
56
|
-
|
57
|
-
**Literal**: Constants (`18`, `"text"`, `true`)
|
58
|
-
```ruby
|
59
|
-
Literal = Struct.new(:value)
|
60
|
-
```
|
61
|
-
|
62
|
-
**ArrayExpression**: Arrays (`[1, 2, 3]`)
|
63
|
-
```ruby
|
64
|
-
ArrayExpression = Struct.new(:elements)
|
65
|
-
```
|
66
|
-
|
67
|
-
## Cascade Expressions (Conditional Values)
|
68
|
-
|
69
|
-
**CascadeExpression**: Container for conditional logic
|
70
|
-
```ruby
|
71
|
-
CascadeExpression = Struct.new(:cases)
|
72
|
-
```
|
73
|
-
|
74
|
-
**CaseExpression**: Individual conditions
|
75
|
-
```ruby
|
76
|
-
CaseExpression = Struct.new(:condition, :result)
|
77
|
-
```
|
78
|
-
|
79
|
-
**Case type mappings**:
|
80
|
-
- `on :a, :b, result` → `condition: fn(:cascade_and, ref(:a), ref(:b))`
|
81
|
-
- `on_any :a, :b, result` → `condition: fn(:any?, ref(:a), ref(:b))`
|
82
|
-
- `base result` → `condition: literal(true)`
|
83
|
-
|
84
|
-
## Key Nuances
|
85
|
-
|
86
|
-
**Operator methods on InputReference**: Enable `input.age >= 18` syntax by defining operators that create `CallExpression` nodes
|
87
|
-
|
88
|
-
**CallExpression `&` method**: Enables expression chaining like `(expr1) & (expr2)`
|
89
|
-
|
90
|
-
**Node immutability**: AST nodes are frozen after construction; analysis results stored separately
|
91
|
-
|
92
|
-
**Location tracking**: All nodes include file/line/column for error reporting
|
93
|
-
|
94
|
-
**Tree traversal**: Each node defines `children` method for recursive processing
|
95
|
-
|
96
|
-
**Expression wrapping**: During parsing, raw values auto-convert to `Literal` nodes via `ensure_syntax()`
|
97
|
-
|
98
|
-
## Common Expression Trees
|
99
|
-
|
100
|
-
**Simple**: `(input.age >= 18)`
|
101
|
-
```
|
102
|
-
CallExpression(:>=, [InputReference(:age), Literal(18)])
|
103
|
-
```
|
104
|
-
|
105
|
-
**Chained AND**: `(input.age >= 21) & (input.verified == true)`
|
106
|
-
```
|
107
|
-
CallExpression(:and, [
|
108
|
-
CallExpression(:>=, [InputReference(:age), Literal(21)]),
|
109
|
-
CallExpression(:==, [InputReference(:verified), Literal(true)])
|
110
|
-
])
|
111
|
-
```
|
112
|
-
|
113
|
-
**Composite Trait**: `adult & verified & high_income`
|
114
|
-
```
|
115
|
-
CallExpression(:and, [
|
116
|
-
CallExpression(:and, [
|
117
|
-
DeclarationReference(:adult),
|
118
|
-
DeclarationReference(:verified)
|
119
|
-
]),
|
120
|
-
DeclarationReference(:high_income)
|
121
|
-
])
|
122
|
-
```
|
123
|
-
|
124
|
-
**Mixed Composition**: `adult & (input.score > 80) & verified`
|
125
|
-
```
|
126
|
-
CallExpression(:and, [
|
127
|
-
CallExpression(:and, [
|
128
|
-
DeclarationReference(:adult),
|
129
|
-
CallExpression(:>, [InputReference(:score), Literal(80)])
|
130
|
-
]),
|
131
|
-
DeclarationReference(:verified)
|
132
|
-
])
|
133
|
-
```
|
data/docs/DSL.md
DELETED
@@ -1,154 +0,0 @@
|
|
1
|
-
# Kumi DSL Reference
|
2
|
-
|
3
|
-
Kumi is a declarative language for defining, analyzing, and executing complex business logic. It compiles rules into a verifiable dependency graph, ensuring that logic is **sound, maintainable, and free of contradictions** before execution (as much as possible given the current library implementation).
|
4
|
-
|
5
|
-
-----
|
6
|
-
|
7
|
-
## Guiding Principles
|
8
|
-
|
9
|
-
Kumi's design is opinionated and guides you toward creating robust and analyzable business logic.
|
10
|
-
|
11
|
-
* **Logic as Code, Not Just Configuration**: Rules are expressed in a clean, readable DSL that can be version-controlled and tested.
|
12
|
-
* **Provable Correctness**: A multi-pass analyzer statically verifies your schema, detecting duplicates, circular dependencies, type errors, and even **logically impossible conditions** (e.g., `age < 25 AND age > 65`) at compile time.
|
13
|
-
* **Explicit Data Contracts**: The mandatory `input` block serves as a formal, self-documenting contract for the data your schema expects, enabling runtime validation of types and domain constraints.
|
14
|
-
* **Composition Over Complexity**: Complex rules are built by composing simpler, named concepts (`trait`s), rather than creating large, monolithic blocks of logic.
|
15
|
-
|
16
|
-
-----
|
17
|
-
|
18
|
-
## Core Syntax
|
19
|
-
|
20
|
-
A Kumi schema contains an `input` block to declare its data contract, followed by `trait` and `value` definitions.
|
21
|
-
|
22
|
-
```ruby
|
23
|
-
schema do
|
24
|
-
# 1. Define the data contract for this schema.
|
25
|
-
input do
|
26
|
-
# ... field declarations
|
27
|
-
end
|
28
|
-
|
29
|
-
# 2. Define reusable boolean predicates (traits).
|
30
|
-
# ... trait definitions
|
31
|
-
|
32
|
-
# 3. Define computed fields (values).
|
33
|
-
# ... value definitions
|
34
|
-
end
|
35
|
-
```
|
36
|
-
|
37
|
-
-----
|
38
|
-
|
39
|
-
## Input Fields: The Data Contract
|
40
|
-
|
41
|
-
The `input` block declares the schema's data dependencies. All external data must be accessed via the `input` object (e.g., `input.age`).
|
42
|
-
|
43
|
-
### **Declaration Methods**
|
44
|
-
|
45
|
-
The preferred way to declare fields is with **type-specific methods**, which provide compile-time type checking and runtime validation.
|
46
|
-
|
47
|
-
* **Primitives**:
|
48
|
-
```ruby
|
49
|
-
string :name
|
50
|
-
integer :age, domain: 18..65
|
51
|
-
float :score, domain: 0.0..100.0
|
52
|
-
boolean :is_active
|
53
|
-
```
|
54
|
-
* **Collections**:
|
55
|
-
```ruby
|
56
|
-
array :tags, elem: { type: :string }
|
57
|
-
hash :metadata, key: { type: :string }, val: { type: :any }
|
58
|
-
```
|
59
|
-
|
60
|
-
### **Domain Constraints**
|
61
|
-
|
62
|
-
Attach validation rules directly to input fields using `domain:`. These are checked when data is loaded.
|
63
|
-
|
64
|
-
* **Range**: `domain: 1..100` or `0.0...1.0` (exclusive end)
|
65
|
-
* **Enumeration**: `domain: %w[pending active archived]`
|
66
|
-
* **Custom Logic**: `domain: ->(value) { value.even? }`
|
67
|
-
|
68
|
-
-----
|
69
|
-
|
70
|
-
## Traits: Named Logical Predicates
|
71
|
-
|
72
|
-
A **`trait`** is a named expression that **must evaluate to a boolean**. Traits are the fundamental building blocks of logic, defining reusable, verifiable conditions.
|
73
|
-
|
74
|
-
### **Defining & Composing Traits**
|
75
|
-
|
76
|
-
Traits are defined with a parenthesized expression and composed using the `&` operator. This composition is strictly **conjunctive (logical AND)**, a key constraint that enables Kumi's powerful static analysis.
|
77
|
-
|
78
|
-
```ruby
|
79
|
-
# Base Traits
|
80
|
-
trait :is_adult, (input.age >= 18)
|
81
|
-
trait :is_verified, (input.status == "verified")
|
82
|
-
|
83
|
-
# Composite Trait (is_adult AND is_verified)
|
84
|
-
trait :can_proceed, is_adult & is_verified
|
85
|
-
|
86
|
-
# Mix bare trait names with inline expressions
|
87
|
-
trait :is_eligible, is_adult & is_verified & (input.score > 50)
|
88
|
-
```
|
89
|
-
|
90
|
-
-----
|
91
|
-
|
92
|
-
## Values: Computed Fields
|
93
|
-
|
94
|
-
A **`value`** is a named expression that computes a field of any type.
|
95
|
-
|
96
|
-
### **Simple Values**
|
97
|
-
|
98
|
-
Values can be defined with expressions using `input` fields, functions (`fn`), and references to other values.
|
99
|
-
|
100
|
-
```ruby
|
101
|
-
value :full_name, fn(:concat, input.first_name, " ", input.last_name)
|
102
|
-
value :discounted_price, fn(:multiply, input.base_price, 0.8)
|
103
|
-
```
|
104
|
-
|
105
|
-
### **Conditional Values (Cascades)**
|
106
|
-
|
107
|
-
For conditional logic, a `value` takes a block to create a **cascade**. Cascades select a result based on a series of conditions, which **must reference named `trait`s**. This enforces clarity by separating the *what* (the condition's name) from the *how* (its implementation).
|
108
|
-
|
109
|
-
```ruby
|
110
|
-
value :access_level do
|
111
|
-
# `on` implies AND: user must be :premium AND :verified.
|
112
|
-
on premium,verified, "Full Access"
|
113
|
-
|
114
|
-
# `on_any` implies OR: user can be :staff OR :admin.
|
115
|
-
on_any staff,admin, "Elevated Access"
|
116
|
-
|
117
|
-
# `on_none` implies NOT (A OR B): user is neither :blocked NOR :suspended.
|
118
|
-
on_none blocked,suspended, "Limited Access"
|
119
|
-
|
120
|
-
# `base` is the default if no other conditions match.
|
121
|
-
base "No Access"
|
122
|
-
end
|
123
|
-
```
|
124
|
-
|
125
|
-
-----
|
126
|
-
|
127
|
-
## The Kumi Pattern: Separating AND vs. OR Logic
|
128
|
-
|
129
|
-
Kumi intentionally enforces a pattern for handling different types of logic to maximize clarity and analyzability.
|
130
|
-
|
131
|
-
* **`trait`s and `&` are for AND logic**: Use `trait` composition to build up a set of conditions that must *all* be true. This is your primary tool for defining constraints.
|
132
|
-
|
133
|
-
* **`value` cascades are for OR logic**: Use `on_any` within a `value` cascade to handle conditions where *any* one of several predicates is sufficient. This is the idiomatic way to express disjunctive logic.
|
134
|
-
|
135
|
-
This separation forces complex `OR` conditions to be handled within the clear, readable structure of a cascade, rather than being hidden inside a complex `trait` definition.
|
136
|
-
|
137
|
-
-----
|
138
|
-
|
139
|
-
## Best Practices
|
140
|
-
|
141
|
-
* **Prefer Small, Composable Traits**: Avoid creating large, monolithic traits with many `&` conditions. Instead, define smaller, named traits and compose them.
|
142
|
-
|
143
|
-
```ruby
|
144
|
-
# AVOID: Hard to read and reuse
|
145
|
-
trait :eligible, (input.age >= 18) & (input.status == "active") & (input.score > 50)
|
146
|
-
|
147
|
-
# PREFER: Clear, reusable, and self-documenting
|
148
|
-
trait :is_adult, (input.age >= 18)
|
149
|
-
trait :is_active, (input.status == "active")
|
150
|
-
trait :has_good_score, (input.score > 50)
|
151
|
-
trait :is_eligible, is_adult & is_active & has_good_score
|
152
|
-
```
|
153
|
-
|
154
|
-
* **Name All Conditions**: If you need to use a condition in a `value` cascade, define it as a `trait` first. This gives the condition a clear business name and makes the cascade easier to read.
|
data/docs/FUNCTIONS.md
DELETED
@@ -1,176 +0,0 @@
|
|
1
|
-
# Kumi Standard Function Library Reference
|
2
|
-
|
3
|
-
Kumi provides a rich library of built-in functions for use within `value` and `trait` expressions via `fn(...)`.
|
4
|
-
|
5
|
-
## Logical Functions
|
6
|
-
|
7
|
-
* **`all?`**: Check if all elements in collection are truthy
|
8
|
-
* **Usage**: `fn(:all?, array(any) arg1)` → `boolean`
|
9
|
-
* **`and`**: Logical AND of multiple conditions
|
10
|
-
* **Usage**: `fn(:and, boolean1, boolean2, ...)` → `boolean`
|
11
|
-
* **`any?`**: Check if any element in collection is truthy
|
12
|
-
* **Usage**: `fn(:any?, array(any) arg1)` → `boolean`
|
13
|
-
* **`cascade_and`**: Element-wise AND for arrays with same nested structure
|
14
|
-
* **Usage**: `fn(:cascade_and, boolean1, boolean2, ...)` → `boolean`
|
15
|
-
* **`none?`**: Check if no elements in collection are truthy
|
16
|
-
* **Usage**: `fn(:none?, array(any) arg1)` → `boolean`
|
17
|
-
* **`not`**: Logical NOT
|
18
|
-
* **Usage**: `fn(:not, boolean arg1)` → `boolean`
|
19
|
-
* **`or`**: Logical OR of multiple conditions
|
20
|
-
* **Usage**: `fn(:or, boolean1, boolean2, ...)` → `boolean`
|
21
|
-
|
22
|
-
## Comparison Functions
|
23
|
-
|
24
|
-
* **`!=`**: Inequality comparison
|
25
|
-
* **Usage**: `fn(:!=, any arg1, any arg2)` → `boolean`
|
26
|
-
* **`<`**: Less than comparison
|
27
|
-
* **Usage**: `fn(:<, float arg1, float arg2)` → `boolean`
|
28
|
-
* **`<=`**: Less than or equal comparison
|
29
|
-
* **Usage**: `fn(:<=, float arg1, float arg2)` → `boolean`
|
30
|
-
* **`==`**: Equality comparison
|
31
|
-
* **Usage**: `fn(:==, any arg1, any arg2)` → `boolean`
|
32
|
-
* **`>`**: Greater than comparison
|
33
|
-
* **Usage**: `fn(:>, float arg1, float arg2)` → `boolean`
|
34
|
-
* **`>=`**: Greater than or equal comparison
|
35
|
-
* **Usage**: `fn(:>=, float arg1, float arg2)` → `boolean`
|
36
|
-
* **`between?`**: Check if value is between min and max
|
37
|
-
* **Usage**: `fn(:between?, float arg1, float arg2, float arg3)` → `boolean`
|
38
|
-
|
39
|
-
## Math Functions
|
40
|
-
|
41
|
-
* **`abs`**: Absolute value
|
42
|
-
* **Usage**: `fn(:abs, float arg1)` → `float`
|
43
|
-
* **`add`**: Add two numbers
|
44
|
-
* **Usage**: `fn(:add, float arg1, float arg2)` → `float`
|
45
|
-
* **`ceil`**: Ceiling of number
|
46
|
-
* **Usage**: `fn(:ceil, float arg1)` → `integer`
|
47
|
-
* **`clamp`**: Clamp value between min and max
|
48
|
-
* **Usage**: `fn(:clamp, float arg1, float arg2, float arg3)` → `float`
|
49
|
-
* **`divide`**: Divide first number by second
|
50
|
-
* **Usage**: `fn(:divide, float arg1, float arg2)` → `float`
|
51
|
-
* **`floor`**: Floor of number
|
52
|
-
* **Usage**: `fn(:floor, float arg1)` → `integer`
|
53
|
-
* **`modulo`**: Modulo operation
|
54
|
-
* **Usage**: `fn(:modulo, float arg1, float arg2)` → `float`
|
55
|
-
* **`multiply`**: Multiply two numbers
|
56
|
-
* **Usage**: `fn(:multiply, float arg1, float arg2)` → `float`
|
57
|
-
* **`piecewise_sum`**: Accumulate over tiered ranges; returns [sum, marginal_rate]
|
58
|
-
* **Usage**: `fn(:piecewise_sum, float arg1, array(float) arg2, array(float) arg3)` → `array(float)`
|
59
|
-
* **`power`**: Raise first number to power of second
|
60
|
-
* **Usage**: `fn(:power, float arg1, float arg2)` → `float`
|
61
|
-
* **`round`**: Round number to specified precision
|
62
|
-
* **Usage**: `fn(:round, float1, float2, ...)` → `float`
|
63
|
-
* **`subtract`**: Subtract second number from first
|
64
|
-
* **Usage**: `fn(:subtract, float arg1, float arg2)` → `float`
|
65
|
-
|
66
|
-
## String Functions
|
67
|
-
|
68
|
-
* **`capitalize`**: Capitalize first letter of string
|
69
|
-
* **Usage**: `fn(:capitalize, string arg1)` → `string`
|
70
|
-
* **`concat`**: Concatenate multiple strings
|
71
|
-
* **Usage**: `fn(:concat, string1, string2, ...)` → `string`
|
72
|
-
* **`contains?`**: Check if string contains substring
|
73
|
-
* **Usage**: `fn(:contains?, string arg1, string arg2)` → `boolean`
|
74
|
-
* **`downcase`**: Convert string to lowercase
|
75
|
-
* **Usage**: `fn(:downcase, string arg1)` → `string`
|
76
|
-
* **`end_with?`**: Check if string ends with suffix
|
77
|
-
* **Usage**: `fn(:end_with?, string arg1, string arg2)` → `boolean`
|
78
|
-
* **`includes?`**: Check if string contains substring
|
79
|
-
* **Usage**: `fn(:includes?, string arg1, string arg2)` → `boolean`
|
80
|
-
* **`length`**: Get string length
|
81
|
-
* **Usage**: `fn(:length, string arg1)` → `integer`
|
82
|
-
* **`start_with?`**: Check if string starts with prefix
|
83
|
-
* **Usage**: `fn(:start_with?, string arg1, string arg2)` → `boolean`
|
84
|
-
* **`string_include?`**: Check if string contains substring
|
85
|
-
* **Usage**: `fn(:string_include?, string arg1, string arg2)` → `boolean`
|
86
|
-
* **`string_length`**: Get string length
|
87
|
-
* **Usage**: `fn(:string_length, string arg1)` → `integer`
|
88
|
-
* **`strip`**: Remove leading and trailing whitespace
|
89
|
-
* **Usage**: `fn(:strip, string arg1)` → `string`
|
90
|
-
* **`upcase`**: Convert string to uppercase
|
91
|
-
* **Usage**: `fn(:upcase, string arg1)` → `string`
|
92
|
-
|
93
|
-
## Collection Functions
|
94
|
-
|
95
|
-
* **`all_across`**: Check if all elements are truthy across all nested levels
|
96
|
-
* **Usage**: `fn(:all_across, array(any) arg1)` → `boolean`
|
97
|
-
* **`any_across`**: Check if any element is truthy across all nested levels
|
98
|
-
* **Usage**: `fn(:any_across, array(any) arg1)` → `boolean`
|
99
|
-
* **`avg_if`**: Average values where corresponding condition is true
|
100
|
-
* **Usage**: `fn(:avg_if, array(float) arg1, array(boolean) arg2)` → `float`
|
101
|
-
* **`build_array`**: Build array of given size with index values
|
102
|
-
* **Usage**: `fn(:build_array, integer arg1)` → `array(any)`
|
103
|
-
* **`count_across`**: Count total elements across all nested levels
|
104
|
-
* **Usage**: `fn(:count_across, array(any) arg1)` → `integer`
|
105
|
-
* **`count_if`**: Count number of true values in boolean array
|
106
|
-
* **Usage**: `fn(:count_if, array(boolean) arg1)` → `integer`
|
107
|
-
* **`each_slice`**: Group array elements into subarrays of given size
|
108
|
-
* **Usage**: `fn(:each_slice, array arg1, integer arg2)` → `array(array)`
|
109
|
-
* **`empty?`**: Check if collection is empty
|
110
|
-
* **Usage**: `fn(:empty?, array(any) arg1)` → `boolean`
|
111
|
-
* **`first`**: Get first element of collection
|
112
|
-
* **Usage**: `fn(:first, array(any) arg1)` → `any`
|
113
|
-
* **`flatten`**: Flatten nested arrays into a single array
|
114
|
-
* **Usage**: `fn(:flatten, array(any) arg1)` → `array(any)`
|
115
|
-
* **`flatten_deep`**: Recursively flatten all nested arrays (alias for flatten)
|
116
|
-
* **Usage**: `fn(:flatten_deep, array(any) arg1)` → `array(any)`
|
117
|
-
* **`flatten_one`**: Flatten nested arrays by one level only
|
118
|
-
* **Usage**: `fn(:flatten_one, array(any) arg1)` → `array(any)`
|
119
|
-
* **`include?`**: Check if collection includes element
|
120
|
-
* **Usage**: `fn(:include?, array(any) arg1, any arg2)` → `boolean`
|
121
|
-
* **`indices`**: Generate array of indices for the collection
|
122
|
-
* **Usage**: `fn(:indices, array(any) arg1)` → `array(integer)`
|
123
|
-
* **`join`**: Join array elements into string with separator
|
124
|
-
* **Usage**: `fn(:join, array arg1, string arg2)` → `string`
|
125
|
-
* **`last`**: Get last element of collection
|
126
|
-
* **Usage**: `fn(:last, array(any) arg1)` → `any`
|
127
|
-
* **`map_add`**: Add value to each element
|
128
|
-
* **Usage**: `fn(:map_add, array(float) arg1, float arg2)` → `array(float)`
|
129
|
-
* **`map_conditional`**: Transform elements based on condition: if element == condition_value then true_value else false_value
|
130
|
-
* **Usage**: `fn(:map_conditional, array arg1, any arg2, any arg3, any arg4)` → `array`
|
131
|
-
* **`map_join_rows`**: Join 2D array into string with row and column separators
|
132
|
-
* **Usage**: `fn(:map_join_rows, array(array) arg1, string arg2, string arg3)` → `string`
|
133
|
-
* **`map_multiply`**: Multiply each element by factor
|
134
|
-
* **Usage**: `fn(:map_multiply, array(float) arg1, float arg2)` → `array(float)`
|
135
|
-
* **`map_with_index`**: Map collection elements to [element, index] pairs
|
136
|
-
* **Usage**: `fn(:map_with_index, array(any) arg1)` → `array(any)`
|
137
|
-
* **`max`**: Find maximum value in numeric collection
|
138
|
-
* **Usage**: `fn(:max, array(float) arg1)` → `float`
|
139
|
-
* **`min`**: Find minimum value in numeric collection
|
140
|
-
* **Usage**: `fn(:min, array(float) arg1)` → `float`
|
141
|
-
* **`range`**: Generate range of integers from start to finish (exclusive)
|
142
|
-
* **Usage**: `fn(:range, integer arg1, integer arg2)` → `array(integer)`
|
143
|
-
* **`reverse`**: Reverse collection order
|
144
|
-
* **Usage**: `fn(:reverse, array(any) arg1)` → `array(any)`
|
145
|
-
* **`size`**: Get collection size
|
146
|
-
* **Usage**: `fn(:size, array(any) arg1)` → `integer`
|
147
|
-
* **`sort`**: Sort collection
|
148
|
-
* **Usage**: `fn(:sort, array(any) arg1)` → `array(any)`
|
149
|
-
* **`sum`**: Sum all numeric elements in collection
|
150
|
-
* **Usage**: `fn(:sum, array(float) arg1)` → `float`
|
151
|
-
* **`sum_if`**: Sum values where corresponding condition is true
|
152
|
-
* **Usage**: `fn(:sum_if, array(float) arg1, array(boolean) arg2)` → `float`
|
153
|
-
* **`unique`**: Remove duplicate elements from collection
|
154
|
-
* **Usage**: `fn(:unique, array(any) arg1)` → `array(any)`
|
155
|
-
|
156
|
-
## Conditional Functions
|
157
|
-
|
158
|
-
* **`coalesce`**: Return first non-nil value
|
159
|
-
* **Usage**: `fn(:coalesce, any1, any2, ...)` → `any`
|
160
|
-
* **`conditional`**: Ternary conditional operator
|
161
|
-
* **Usage**: `fn(:conditional, boolean arg1, any arg2, any arg3)` → `any`
|
162
|
-
* **`if`**: If-then-else conditional
|
163
|
-
* **Usage**: `fn(:if, boolean1, boolean2, ...)` → `any`
|
164
|
-
|
165
|
-
## Type & Hash Functions
|
166
|
-
|
167
|
-
* **`at`**: Get element at index from array
|
168
|
-
* **Usage**: `fn(:at, array(any) arg1, integer arg2)` → `any`
|
169
|
-
* **`fetch`**: Fetch value from hash with optional default
|
170
|
-
* **Usage**: `fn(:fetch, hash(any, any)1, hash(any, any)2, ...)` → `any`
|
171
|
-
* **`has_key?`**: Check if hash has the given key
|
172
|
-
* **Usage**: `fn(:has_key?, hash(any, any) arg1, any arg2)` → `boolean`
|
173
|
-
* **`keys`**: Get all keys from hash
|
174
|
-
* **Usage**: `fn(:keys, hash(any, any) arg1)` → `array(any)`
|
175
|
-
* **`values`**: Get all values from hash
|
176
|
-
* **Usage**: `fn(:values, hash(any, any) arg1)` → `array(any)`
|