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.
Files changed (676) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -1
  3. data/.ruby-version +1 -0
  4. data/CHANGELOG.md +28 -0
  5. data/CLAUDE.md +26 -139
  6. data/README.md +143 -372
  7. data/data/functions/agg/boolean.yaml +14 -0
  8. data/data/functions/agg/numeric.yaml +80 -0
  9. data/data/functions/agg/string.yaml +8 -0
  10. data/data/functions/core/arithmetic.yaml +50 -0
  11. data/data/functions/core/boolean.yaml +18 -0
  12. data/data/functions/core/comparison.yaml +42 -0
  13. data/data/functions/core/constructor.yaml +32 -0
  14. data/data/functions/core/select.yaml +7 -0
  15. data/data/functions/core/stencil.yaml +21 -0
  16. data/data/functions/core/string.yaml +19 -0
  17. data/data/kernels/javascript/agg/boolean.yaml +12 -0
  18. data/data/kernels/javascript/agg/numeric.yaml +27 -0
  19. data/data/kernels/javascript/agg/string.yaml +5 -0
  20. data/data/kernels/javascript/core/arithmetic.yaml +32 -0
  21. data/data/kernels/javascript/core/boolean.yaml +12 -0
  22. data/data/kernels/javascript/core/comparison.yaml +24 -0
  23. data/data/kernels/javascript/core/constructor.yaml +15 -0
  24. data/data/kernels/javascript/core/select.yaml +7 -0
  25. data/data/kernels/javascript/core/string.yaml +12 -0
  26. data/data/kernels/ruby/agg/boolean.yaml +18 -0
  27. data/data/kernels/ruby/agg/numeric.yaml +29 -0
  28. data/data/kernels/ruby/agg/string.yaml +5 -0
  29. data/data/kernels/ruby/core/arithmetic.yaml +38 -0
  30. data/data/kernels/ruby/core/boolean.yaml +15 -0
  31. data/data/kernels/ruby/core/comparison.yaml +30 -0
  32. data/data/kernels/ruby/core/constructor.yaml +17 -0
  33. data/data/kernels/ruby/core/select.yaml +4 -0
  34. data/data/kernels/ruby/core/string.yaml +15 -0
  35. data/debug_ordering.rb +52 -0
  36. data/docs/FORM_SCHEMA.md +85 -0
  37. data/docs/OUTPUT_SCHEMA.md +69 -0
  38. data/docs/SYNTAX.md +626 -373
  39. data/golden/array_element/expected/ast.txt +21 -0
  40. data/golden/array_element/expected/input_plan.txt +5 -0
  41. data/golden/array_element/expected/lir_00_unoptimized.txt +13 -0
  42. data/golden/array_element/expected/lir_01_hoist_scalar_references.txt +13 -0
  43. data/golden/array_element/expected/lir_02_inlined.txt +13 -0
  44. data/golden/array_element/expected/lir_03_cse.txt +13 -0
  45. data/golden/array_element/expected/lir_04_1_loop_fusion.txt +13 -0
  46. data/golden/array_element/expected/lir_04_loop_invcm.txt +13 -0
  47. data/golden/array_element/expected/lir_06_const_prop.txt +13 -0
  48. data/golden/array_element/expected/nast.txt +7 -0
  49. data/golden/array_element/expected/schema_javascript.mjs +13 -0
  50. data/golden/array_element/expected/schema_ruby.rb +41 -0
  51. data/golden/array_element/expected/snast.txt +7 -0
  52. data/golden/array_element/expected.json +5 -0
  53. data/golden/array_element/input.json +9 -0
  54. data/golden/array_element/schema.kumi +11 -0
  55. data/golden/array_index/expected/ast.txt +59 -0
  56. data/golden/array_index/expected/input_plan.txt +5 -0
  57. data/golden/array_index/expected/lir_00_unoptimized.txt +41 -0
  58. data/golden/array_index/expected/lir_01_hoist_scalar_references.txt +41 -0
  59. data/golden/array_index/expected/lir_02_inlined.txt +42 -0
  60. data/golden/array_index/expected/lir_03_cse.txt +40 -0
  61. data/golden/array_index/expected/lir_04_1_loop_fusion.txt +40 -0
  62. data/golden/array_index/expected/lir_04_loop_invcm.txt +40 -0
  63. data/golden/array_index/expected/lir_06_const_prop.txt +40 -0
  64. data/golden/array_index/expected/nast.txt +33 -0
  65. data/golden/array_index/expected/schema_javascript.mjs +46 -0
  66. data/golden/array_index/expected/schema_ruby.rb +75 -0
  67. data/golden/array_index/expected/snast.txt +33 -0
  68. data/golden/array_index/expected.json +5 -0
  69. data/golden/array_index/input.json +1 -0
  70. data/golden/array_index/schema.kumi +19 -0
  71. data/golden/array_operations/expected/ast.txt +50 -0
  72. data/golden/array_operations/expected/input_plan.txt +10 -0
  73. data/golden/array_operations/expected/lir_00_unoptimized.txt +47 -0
  74. data/golden/array_operations/expected/lir_01_hoist_scalar_references.txt +47 -0
  75. data/golden/array_operations/expected/lir_02_inlined.txt +47 -0
  76. data/golden/array_operations/expected/lir_03_cse.txt +47 -0
  77. data/golden/array_operations/expected/lir_04_1_loop_fusion.txt +47 -0
  78. data/golden/array_operations/expected/lir_04_loop_invcm.txt +47 -0
  79. data/golden/array_operations/expected/lir_06_const_prop.txt +47 -0
  80. data/golden/array_operations/expected/nast.txt +32 -0
  81. data/golden/array_operations/expected/schema_javascript.mjs +60 -0
  82. data/golden/array_operations/expected/schema_ruby.rb +91 -0
  83. data/golden/array_operations/expected/snast.txt +32 -0
  84. data/golden/array_operations/expected.json +27 -0
  85. data/golden/array_operations/input.json +8 -0
  86. data/golden/array_operations/schema.kumi +12 -10
  87. data/golden/cascade_logic/expected/ast.txt +37 -0
  88. data/golden/cascade_logic/expected/input_plan.txt +2 -0
  89. data/golden/cascade_logic/expected/lir_00_unoptimized.txt +29 -0
  90. data/golden/cascade_logic/expected/lir_01_hoist_scalar_references.txt +29 -0
  91. data/golden/cascade_logic/expected/lir_02_inlined.txt +37 -0
  92. data/golden/cascade_logic/expected/lir_03_cse.txt +30 -0
  93. data/golden/cascade_logic/expected/lir_04_1_loop_fusion.txt +30 -0
  94. data/golden/cascade_logic/expected/lir_04_loop_invcm.txt +30 -0
  95. data/golden/cascade_logic/expected/lir_06_const_prop.txt +30 -0
  96. data/golden/cascade_logic/expected/nast.txt +32 -0
  97. data/golden/cascade_logic/expected/schema_javascript.mjs +31 -0
  98. data/golden/cascade_logic/expected/schema_ruby.rb +57 -0
  99. data/golden/cascade_logic/expected/snast.txt +32 -0
  100. data/golden/cascade_logic/expected.json +5 -0
  101. data/golden/cascade_logic/input.json +4 -0
  102. data/golden/cascade_logic/schema.kumi +1 -3
  103. data/golden/chained_fusion/expected/ast.txt +57 -0
  104. data/golden/chained_fusion/expected/input_plan.txt +13 -0
  105. data/golden/chained_fusion/expected/lir_00_unoptimized.txt +76 -0
  106. data/golden/chained_fusion/expected/lir_01_hoist_scalar_references.txt +76 -0
  107. data/golden/chained_fusion/expected/lir_02_inlined.txt +114 -0
  108. data/golden/chained_fusion/expected/lir_03_cse.txt +97 -0
  109. data/golden/chained_fusion/expected/lir_04_1_loop_fusion.txt +99 -0
  110. data/golden/chained_fusion/expected/lir_04_loop_invcm.txt +97 -0
  111. data/golden/chained_fusion/expected/lir_06_const_prop.txt +97 -0
  112. data/golden/chained_fusion/expected/nast.txt +55 -0
  113. data/golden/chained_fusion/expected/schema_javascript.mjs +116 -0
  114. data/golden/chained_fusion/expected/schema_ruby.rb +149 -0
  115. data/golden/chained_fusion/expected/snast.txt +55 -0
  116. data/golden/chained_fusion/expected.json +45 -0
  117. data/golden/chained_fusion/input.json +51 -0
  118. data/golden/chained_fusion/schema.kumi +52 -0
  119. data/golden/element_arrays/expected/ast.txt +55 -0
  120. data/golden/element_arrays/expected/input_plan.txt +7 -0
  121. data/golden/element_arrays/expected/lir_00_unoptimized.txt +81 -0
  122. data/golden/element_arrays/expected/lir_01_hoist_scalar_references.txt +81 -0
  123. data/golden/element_arrays/expected/lir_02_inlined.txt +85 -0
  124. data/golden/element_arrays/expected/lir_03_cse.txt +83 -0
  125. data/golden/element_arrays/expected/lir_04_1_loop_fusion.txt +83 -0
  126. data/golden/element_arrays/expected/lir_04_loop_invcm.txt +83 -0
  127. data/golden/element_arrays/expected/lir_06_const_prop.txt +83 -0
  128. data/golden/element_arrays/expected/nast.txt +42 -0
  129. data/golden/element_arrays/expected/schema_javascript.mjs +106 -0
  130. data/golden/element_arrays/expected/schema_ruby.rb +141 -0
  131. data/golden/element_arrays/expected/snast.txt +42 -0
  132. data/golden/element_arrays/expected.json +55 -0
  133. data/golden/element_arrays/input.json +12 -0
  134. data/golden/element_arrays/schema.kumi +21 -0
  135. data/golden/empty_and_null_inputs/expected/ast.txt +42 -0
  136. data/golden/empty_and_null_inputs/expected/input_plan.txt +12 -0
  137. data/golden/empty_and_null_inputs/expected/lir_00_unoptimized.txt +31 -0
  138. data/golden/empty_and_null_inputs/expected/lir_01_hoist_scalar_references.txt +31 -0
  139. data/golden/empty_and_null_inputs/expected/lir_02_inlined.txt +51 -0
  140. data/golden/empty_and_null_inputs/expected/lir_03_cse.txt +49 -0
  141. data/golden/empty_and_null_inputs/expected/lir_04_1_loop_fusion.txt +49 -0
  142. data/golden/empty_and_null_inputs/expected/lir_04_loop_invcm.txt +49 -0
  143. data/golden/empty_and_null_inputs/expected/lir_06_const_prop.txt +49 -0
  144. data/golden/empty_and_null_inputs/expected/nast.txt +18 -0
  145. data/golden/empty_and_null_inputs/expected/schema_javascript.mjs +47 -0
  146. data/golden/empty_and_null_inputs/expected/schema_ruby.rb +79 -0
  147. data/golden/empty_and_null_inputs/expected/snast.txt +18 -0
  148. data/golden/empty_and_null_inputs/expected.json +8 -0
  149. data/golden/empty_and_null_inputs/input.json +16 -0
  150. data/golden/empty_and_null_inputs/schema.kumi +30 -0
  151. data/golden/game_of_life/expected/ast.txt +118 -0
  152. data/golden/game_of_life/expected/input_plan.txt +5 -0
  153. data/golden/game_of_life/expected/lir_00_unoptimized.txt +343 -0
  154. data/golden/game_of_life/expected/lir_01_hoist_scalar_references.txt +343 -0
  155. data/golden/game_of_life/expected/lir_02_inlined.txt +1918 -0
  156. data/golden/game_of_life/expected/lir_03_cse.txt +766 -0
  157. data/golden/game_of_life/expected/lir_04_1_loop_fusion.txt +766 -0
  158. data/golden/game_of_life/expected/lir_04_loop_invcm.txt +766 -0
  159. data/golden/game_of_life/expected/lir_06_const_prop.txt +766 -0
  160. data/golden/game_of_life/expected/nast.txt +104 -0
  161. data/golden/game_of_life/expected/schema_javascript.mjs +98 -0
  162. data/golden/game_of_life/expected/schema_ruby.rb +125 -0
  163. data/golden/game_of_life/expected/snast.txt +104 -0
  164. data/golden/game_of_life/expected.json +3 -0
  165. data/golden/game_of_life/input.json +8 -0
  166. data/golden/game_of_life/schema.kumi +33 -0
  167. data/golden/hash_keys/expected/ast.txt +29 -0
  168. data/golden/hash_keys/expected/input_plan.txt +2 -0
  169. data/golden/hash_keys/expected/lir_00_unoptimized.txt +18 -0
  170. data/golden/hash_keys/expected/lir_01_hoist_scalar_references.txt +18 -0
  171. data/golden/hash_keys/expected/lir_02_inlined.txt +18 -0
  172. data/golden/hash_keys/expected/lir_03_cse.txt +18 -0
  173. data/golden/hash_keys/expected/lir_04_1_loop_fusion.txt +18 -0
  174. data/golden/hash_keys/expected/lir_04_loop_invcm.txt +18 -0
  175. data/golden/hash_keys/expected/lir_06_const_prop.txt +18 -0
  176. data/golden/hash_keys/expected/nast.txt +46 -0
  177. data/golden/hash_keys/expected/schema_javascript.mjs +34 -0
  178. data/golden/hash_keys/expected/schema_ruby.rb +61 -0
  179. data/golden/hash_keys/expected/snast.txt +46 -0
  180. data/golden/hash_keys/expected.json +20 -0
  181. data/golden/hash_keys/input.json +4 -0
  182. data/golden/hash_keys/schema.kumi +14 -0
  183. data/golden/hash_value/expected/ast.txt +37 -0
  184. data/golden/hash_value/expected/input_plan.txt +7 -0
  185. data/golden/hash_value/expected/lir_00_unoptimized.txt +30 -0
  186. data/golden/hash_value/expected/lir_01_hoist_scalar_references.txt +30 -0
  187. data/golden/hash_value/expected/lir_02_inlined.txt +36 -0
  188. data/golden/hash_value/expected/lir_03_cse.txt +33 -0
  189. data/golden/hash_value/expected/lir_04_1_loop_fusion.txt +33 -0
  190. data/golden/hash_value/expected/lir_04_loop_invcm.txt +33 -0
  191. data/golden/hash_value/expected/lir_06_const_prop.txt +33 -0
  192. data/golden/hash_value/expected/nast.txt +25 -0
  193. data/golden/hash_value/expected/schema_javascript.mjs +46 -0
  194. data/golden/hash_value/expected/schema_ruby.rb +75 -0
  195. data/golden/hash_value/expected/snast.txt +25 -0
  196. data/golden/hash_value/expected.json +19 -0
  197. data/golden/hash_value/input.json +12 -0
  198. data/golden/hash_value/schema.kumi +19 -0
  199. data/golden/hierarchical_complex/expected/ast.txt +85 -0
  200. data/golden/hierarchical_complex/expected/input_plan.txt +23 -0
  201. data/golden/hierarchical_complex/expected/lir_00_unoptimized.txt +87 -0
  202. data/golden/hierarchical_complex/expected/lir_01_hoist_scalar_references.txt +87 -0
  203. data/golden/hierarchical_complex/expected/lir_02_inlined.txt +115 -0
  204. data/golden/hierarchical_complex/expected/lir_03_cse.txt +89 -0
  205. data/golden/hierarchical_complex/expected/lir_04_1_loop_fusion.txt +89 -0
  206. data/golden/hierarchical_complex/expected/lir_04_loop_invcm.txt +89 -0
  207. data/golden/hierarchical_complex/expected/lir_06_const_prop.txt +89 -0
  208. data/golden/hierarchical_complex/expected/nast.txt +49 -0
  209. data/golden/hierarchical_complex/expected/schema_javascript.mjs +121 -0
  210. data/golden/hierarchical_complex/expected/schema_ruby.rb +151 -0
  211. data/golden/hierarchical_complex/expected/snast.txt +49 -0
  212. data/golden/hierarchical_complex/expected.json +34 -0
  213. data/golden/hierarchical_complex/input.json +26 -0
  214. data/golden/hierarchical_complex/schema.kumi +38 -0
  215. data/golden/input_reference/expected/ast.txt +46 -0
  216. data/golden/input_reference/expected/input_plan.txt +15 -0
  217. data/golden/input_reference/expected/lir_00_unoptimized.txt +39 -0
  218. data/golden/input_reference/expected/lir_01_hoist_scalar_references.txt +39 -0
  219. data/golden/input_reference/expected/lir_02_inlined.txt +39 -0
  220. data/golden/input_reference/expected/lir_03_cse.txt +39 -0
  221. data/golden/input_reference/expected/lir_04_1_loop_fusion.txt +39 -0
  222. data/golden/input_reference/expected/lir_04_loop_invcm.txt +39 -0
  223. data/golden/input_reference/expected/lir_06_const_prop.txt +39 -0
  224. data/golden/input_reference/expected/nast.txt +21 -0
  225. data/golden/input_reference/expected/schema_javascript.mjs +45 -0
  226. data/golden/input_reference/expected/schema_ruby.rb +74 -0
  227. data/golden/input_reference/expected/snast.txt +21 -0
  228. data/golden/input_reference/expected.json +7 -0
  229. data/golden/input_reference/input.json +11 -0
  230. data/golden/input_reference/schema.kumi +22 -0
  231. data/golden/interleaved_fusion/expected/ast.txt +51 -0
  232. data/golden/interleaved_fusion/expected/input_plan.txt +13 -0
  233. data/golden/interleaved_fusion/expected/lir_00_unoptimized.txt +53 -0
  234. data/golden/interleaved_fusion/expected/lir_01_hoist_scalar_references.txt +53 -0
  235. data/golden/interleaved_fusion/expected/lir_02_inlined.txt +89 -0
  236. data/golden/interleaved_fusion/expected/lir_03_cse.txt +77 -0
  237. data/golden/interleaved_fusion/expected/lir_04_1_loop_fusion.txt +77 -0
  238. data/golden/interleaved_fusion/expected/lir_04_loop_invcm.txt +77 -0
  239. data/golden/interleaved_fusion/expected/lir_06_const_prop.txt +77 -0
  240. data/golden/interleaved_fusion/expected/nast.txt +41 -0
  241. data/golden/interleaved_fusion/expected/schema_javascript.mjs +86 -0
  242. data/golden/interleaved_fusion/expected/schema_ruby.rb +122 -0
  243. data/golden/interleaved_fusion/expected/snast.txt +41 -0
  244. data/golden/interleaved_fusion/expected.json +37 -0
  245. data/golden/interleaved_fusion/input.json +26 -0
  246. data/golden/interleaved_fusion/schema.kumi +57 -0
  247. data/golden/let_inline/expected/ast.txt +33 -0
  248. data/golden/let_inline/expected/input_plan.txt +2 -0
  249. data/golden/let_inline/expected/lir_00_unoptimized.txt +26 -0
  250. data/golden/let_inline/expected/lir_01_hoist_scalar_references.txt +26 -0
  251. data/golden/let_inline/expected/lir_02_inlined.txt +36 -0
  252. data/golden/let_inline/expected/lir_03_cse.txt +30 -0
  253. data/golden/let_inline/expected/lir_04_1_loop_fusion.txt +30 -0
  254. data/golden/let_inline/expected/lir_04_loop_invcm.txt +30 -0
  255. data/golden/let_inline/expected/lir_06_const_prop.txt +30 -0
  256. data/golden/let_inline/expected/nast.txt +26 -0
  257. data/golden/let_inline/expected/schema_javascript.mjs +11 -0
  258. data/golden/let_inline/expected/schema_ruby.rb +37 -0
  259. data/golden/let_inline/expected/snast.txt +26 -0
  260. data/golden/let_inline/expected.json +1 -0
  261. data/golden/let_inline/input.json +1 -0
  262. data/golden/let_inline/schema.kumi +11 -0
  263. data/golden/loop_fusion/expected/ast.txt +44 -0
  264. data/golden/loop_fusion/expected/input_plan.txt +13 -0
  265. data/golden/loop_fusion/expected/lir_00_unoptimized.txt +43 -0
  266. data/golden/loop_fusion/expected/lir_01_hoist_scalar_references.txt +43 -0
  267. data/golden/loop_fusion/expected/lir_02_inlined.txt +62 -0
  268. data/golden/loop_fusion/expected/lir_03_cse.txt +57 -0
  269. data/golden/loop_fusion/expected/lir_04_1_loop_fusion.txt +57 -0
  270. data/golden/loop_fusion/expected/lir_04_loop_invcm.txt +57 -0
  271. data/golden/loop_fusion/expected/lir_06_const_prop.txt +57 -0
  272. data/golden/loop_fusion/expected/nast.txt +32 -0
  273. data/golden/loop_fusion/expected/schema_javascript.mjs +64 -0
  274. data/golden/loop_fusion/expected/schema_ruby.rb +97 -0
  275. data/golden/loop_fusion/expected/snast.txt +32 -0
  276. data/golden/loop_fusion/expected.json +30 -0
  277. data/golden/loop_fusion/input.json +28 -0
  278. data/golden/loop_fusion/schema.kumi +32 -0
  279. data/golden/min_reduce_scope/expected/ast.txt +49 -0
  280. data/golden/min_reduce_scope/expected/input_plan.txt +9 -0
  281. data/golden/min_reduce_scope/expected/lir_00_unoptimized.txt +59 -0
  282. data/golden/min_reduce_scope/expected/lir_01_hoist_scalar_references.txt +59 -0
  283. data/golden/min_reduce_scope/expected/lir_02_inlined.txt +63 -0
  284. data/golden/min_reduce_scope/expected/lir_03_cse.txt +60 -0
  285. data/golden/min_reduce_scope/expected/lir_04_1_loop_fusion.txt +60 -0
  286. data/golden/min_reduce_scope/expected/lir_04_loop_invcm.txt +60 -0
  287. data/golden/min_reduce_scope/expected/lir_06_const_prop.txt +60 -0
  288. data/golden/min_reduce_scope/expected/nast.txt +29 -0
  289. data/golden/min_reduce_scope/expected/schema_javascript.mjs +66 -0
  290. data/golden/min_reduce_scope/expected/schema_ruby.rb +99 -0
  291. data/golden/min_reduce_scope/expected/snast.txt +29 -0
  292. data/golden/min_reduce_scope/expected.json +9 -0
  293. data/golden/min_reduce_scope/input.json +18 -0
  294. data/golden/min_reduce_scope/schema.kumi +25 -0
  295. data/golden/mixed_dimensions/expected/ast.txt +54 -0
  296. data/golden/mixed_dimensions/expected/input_plan.txt +15 -0
  297. data/golden/mixed_dimensions/expected/lir_00_unoptimized.txt +42 -0
  298. data/golden/mixed_dimensions/expected/lir_01_hoist_scalar_references.txt +42 -0
  299. data/golden/mixed_dimensions/expected/lir_02_inlined.txt +48 -0
  300. data/golden/mixed_dimensions/expected/lir_03_cse.txt +48 -0
  301. data/golden/mixed_dimensions/expected/lir_04_1_loop_fusion.txt +48 -0
  302. data/golden/mixed_dimensions/expected/lir_04_loop_invcm.txt +48 -0
  303. data/golden/mixed_dimensions/expected/lir_06_const_prop.txt +48 -0
  304. data/golden/mixed_dimensions/expected/nast.txt +22 -0
  305. data/golden/mixed_dimensions/expected/schema_javascript.mjs +53 -0
  306. data/golden/mixed_dimensions/expected/schema_ruby.rb +84 -0
  307. data/golden/mixed_dimensions/expected/snast.txt +22 -0
  308. data/golden/mixed_dimensions/expected.json +6 -0
  309. data/golden/mixed_dimensions/input.json +22 -0
  310. data/golden/mixed_dimensions/schema.kumi +35 -0
  311. data/golden/multirank_hoisting/expected/ast.txt +72 -0
  312. data/golden/multirank_hoisting/expected/input_plan.txt +18 -0
  313. data/golden/multirank_hoisting/expected/lir_00_unoptimized.txt +75 -0
  314. data/golden/multirank_hoisting/expected/lir_01_hoist_scalar_references.txt +75 -0
  315. data/golden/multirank_hoisting/expected/lir_02_inlined.txt +126 -0
  316. data/golden/multirank_hoisting/expected/lir_03_cse.txt +109 -0
  317. data/golden/multirank_hoisting/expected/lir_04_1_loop_fusion.txt +109 -0
  318. data/golden/multirank_hoisting/expected/lir_04_loop_invcm.txt +109 -0
  319. data/golden/multirank_hoisting/expected/lir_06_const_prop.txt +109 -0
  320. data/golden/multirank_hoisting/expected/nast.txt +39 -0
  321. data/golden/multirank_hoisting/expected/schema_javascript.mjs +128 -0
  322. data/golden/multirank_hoisting/expected/schema_ruby.rb +162 -0
  323. data/golden/multirank_hoisting/expected/snast.txt +39 -0
  324. data/golden/multirank_hoisting/expected.json +15 -0
  325. data/golden/multirank_hoisting/input.json +19 -0
  326. data/golden/multirank_hoisting/schema.kumi +38 -0
  327. data/golden/nested_hash/expected/ast.txt +22 -0
  328. data/golden/nested_hash/expected/input_plan.txt +5 -0
  329. data/golden/nested_hash/expected/lir_00_unoptimized.txt +10 -0
  330. data/golden/nested_hash/expected/lir_01_hoist_scalar_references.txt +10 -0
  331. data/golden/nested_hash/expected/lir_02_inlined.txt +10 -0
  332. data/golden/nested_hash/expected/lir_03_cse.txt +10 -0
  333. data/golden/nested_hash/expected/lir_04_1_loop_fusion.txt +10 -0
  334. data/golden/nested_hash/expected/lir_04_loop_invcm.txt +10 -0
  335. data/golden/nested_hash/expected/lir_06_const_prop.txt +10 -0
  336. data/golden/nested_hash/expected/nast.txt +8 -0
  337. data/golden/nested_hash/expected/schema_javascript.mjs +9 -0
  338. data/golden/nested_hash/expected/schema_ruby.rb +35 -0
  339. data/golden/nested_hash/expected/snast.txt +8 -0
  340. data/golden/nested_hash/expected.json +3 -0
  341. data/golden/nested_hash/input.json +7 -0
  342. data/golden/nested_hash/schema.kumi +11 -0
  343. data/golden/reduction_broadcast/expected/ast.txt +49 -0
  344. data/golden/reduction_broadcast/expected/input_plan.txt +13 -0
  345. data/golden/reduction_broadcast/expected/lir_00_unoptimized.txt +49 -0
  346. data/golden/reduction_broadcast/expected/lir_01_hoist_scalar_references.txt +49 -0
  347. data/golden/reduction_broadcast/expected/lir_02_inlined.txt +80 -0
  348. data/golden/reduction_broadcast/expected/lir_03_cse.txt +68 -0
  349. data/golden/reduction_broadcast/expected/lir_04_1_loop_fusion.txt +68 -0
  350. data/golden/reduction_broadcast/expected/lir_04_loop_invcm.txt +68 -0
  351. data/golden/reduction_broadcast/expected/lir_06_const_prop.txt +68 -0
  352. data/golden/reduction_broadcast/expected/nast.txt +24 -0
  353. data/golden/reduction_broadcast/expected/schema_javascript.mjs +74 -0
  354. data/golden/reduction_broadcast/expected/schema_ruby.rb +110 -0
  355. data/golden/reduction_broadcast/expected/snast.txt +24 -0
  356. data/golden/reduction_broadcast/expected.json +25 -0
  357. data/golden/reduction_broadcast/input.json +19 -0
  358. data/golden/reduction_broadcast/schema.kumi +34 -0
  359. data/golden/roll/expected/ast.txt +36 -0
  360. data/golden/roll/expected/input_plan.txt +3 -0
  361. data/golden/roll/expected/lir_00_unoptimized.txt +56 -0
  362. data/golden/roll/expected/lir_01_hoist_scalar_references.txt +56 -0
  363. data/golden/roll/expected/lir_02_inlined.txt +56 -0
  364. data/golden/roll/expected/lir_03_cse.txt +55 -0
  365. data/golden/roll/expected/lir_04_1_loop_fusion.txt +55 -0
  366. data/golden/roll/expected/lir_04_loop_invcm.txt +55 -0
  367. data/golden/roll/expected/lir_06_const_prop.txt +55 -0
  368. data/golden/roll/expected/nast.txt +26 -0
  369. data/golden/roll/expected/schema_javascript.mjs +65 -0
  370. data/golden/roll/expected/schema_ruby.rb +95 -0
  371. data/golden/roll/expected/snast.txt +26 -0
  372. data/golden/roll/expected.json +6 -0
  373. data/golden/roll/input.json +1 -0
  374. data/golden/roll/schema.kumi +13 -0
  375. data/golden/shift/expected/ast.txt +48 -0
  376. data/golden/shift/expected/input_plan.txt +3 -0
  377. data/golden/shift/expected/lir_00_unoptimized.txt +96 -0
  378. data/golden/shift/expected/lir_01_hoist_scalar_references.txt +96 -0
  379. data/golden/shift/expected/lir_02_inlined.txt +96 -0
  380. data/golden/shift/expected/lir_03_cse.txt +90 -0
  381. data/golden/shift/expected/lir_04_1_loop_fusion.txt +90 -0
  382. data/golden/shift/expected/lir_04_loop_invcm.txt +90 -0
  383. data/golden/shift/expected/lir_06_const_prop.txt +90 -0
  384. data/golden/shift/expected/nast.txt +38 -0
  385. data/golden/shift/expected/schema_javascript.mjs +106 -0
  386. data/golden/shift/expected/schema_ruby.rb +138 -0
  387. data/golden/shift/expected/snast.txt +38 -0
  388. data/golden/shift/expected.json +8 -0
  389. data/golden/shift/input.json +1 -0
  390. data/golden/shift/schema.kumi +15 -0
  391. data/golden/shift_2d/expected/ast.txt +88 -0
  392. data/golden/shift_2d/expected/input_plan.txt +5 -0
  393. data/golden/shift_2d/expected/lir_00_unoptimized.txt +274 -0
  394. data/golden/shift_2d/expected/lir_01_hoist_scalar_references.txt +274 -0
  395. data/golden/shift_2d/expected/lir_02_inlined.txt +274 -0
  396. data/golden/shift_2d/expected/lir_03_cse.txt +262 -0
  397. data/golden/shift_2d/expected/lir_04_1_loop_fusion.txt +262 -0
  398. data/golden/shift_2d/expected/lir_04_loop_invcm.txt +262 -0
  399. data/golden/shift_2d/expected/lir_06_const_prop.txt +262 -0
  400. data/golden/shift_2d/expected/nast.txt +74 -0
  401. data/golden/shift_2d/expected/schema_javascript.mjs +320 -0
  402. data/golden/shift_2d/expected/schema_ruby.rb +358 -0
  403. data/golden/shift_2d/expected/snast.txt +74 -0
  404. data/golden/shift_2d/expected.json +15 -0
  405. data/golden/shift_2d/input.json +14 -0
  406. data/golden/shift_2d/schema.kumi +25 -0
  407. data/golden/simple_math/expected/ast.txt +40 -0
  408. data/golden/simple_math/expected/input_plan.txt +2 -0
  409. data/golden/simple_math/expected/lir_00_unoptimized.txt +31 -0
  410. data/golden/simple_math/expected/lir_01_hoist_scalar_references.txt +31 -0
  411. data/golden/simple_math/expected/lir_02_inlined.txt +31 -0
  412. data/golden/simple_math/expected/lir_03_cse.txt +31 -0
  413. data/golden/simple_math/expected/lir_04_1_loop_fusion.txt +31 -0
  414. data/golden/simple_math/expected/lir_04_loop_invcm.txt +31 -0
  415. data/golden/simple_math/expected/lir_06_const_prop.txt +31 -0
  416. data/golden/simple_math/expected/nast.txt +33 -0
  417. data/golden/simple_math/expected/schema_javascript.mjs +33 -0
  418. data/golden/simple_math/expected/schema_ruby.rb +59 -0
  419. data/golden/simple_math/expected/snast.txt +33 -0
  420. data/golden/simple_math/expected.json +1 -0
  421. data/golden/simple_math/input.json +4 -0
  422. data/golden/simple_math/schema.kumi +2 -1
  423. data/golden/streaming_basics/expected/ast.txt +64 -0
  424. data/golden/streaming_basics/expected/input_plan.txt +8 -0
  425. data/golden/streaming_basics/expected/lir_00_unoptimized.txt +73 -0
  426. data/golden/streaming_basics/expected/lir_01_hoist_scalar_references.txt +73 -0
  427. data/golden/streaming_basics/expected/lir_02_inlined.txt +100 -0
  428. data/golden/streaming_basics/expected/lir_03_cse.txt +84 -0
  429. data/golden/streaming_basics/expected/lir_04_1_loop_fusion.txt +84 -0
  430. data/golden/streaming_basics/expected/lir_04_loop_invcm.txt +84 -0
  431. data/golden/streaming_basics/expected/lir_06_const_prop.txt +84 -0
  432. data/golden/streaming_basics/expected/nast.txt +48 -0
  433. data/golden/streaming_basics/expected/schema_javascript.mjs +94 -0
  434. data/golden/streaming_basics/expected/schema_ruby.rb +127 -0
  435. data/golden/streaming_basics/expected/snast.txt +48 -0
  436. data/golden/streaming_basics/expected.json +10 -0
  437. data/golden/streaming_basics/input.json +8 -0
  438. data/golden/streaming_basics/schema.kumi +24 -0
  439. data/golden/tuples/expected/ast.txt +48 -0
  440. data/golden/tuples/expected/input_plan.txt +1 -0
  441. data/golden/tuples/expected/lir_00_unoptimized.txt +40 -0
  442. data/golden/tuples/expected/lir_01_hoist_scalar_references.txt +40 -0
  443. data/golden/tuples/expected/lir_02_inlined.txt +48 -0
  444. data/golden/tuples/expected/lir_03_cse.txt +48 -0
  445. data/golden/tuples/expected/lir_04_1_loop_fusion.txt +48 -0
  446. data/golden/tuples/expected/lir_04_loop_invcm.txt +48 -0
  447. data/golden/tuples/expected/lir_06_const_prop.txt +48 -0
  448. data/golden/tuples/expected/nast.txt +42 -0
  449. data/golden/tuples/expected/schema_javascript.mjs +51 -0
  450. data/golden/tuples/expected/schema_ruby.rb +77 -0
  451. data/golden/tuples/expected/snast.txt +42 -0
  452. data/golden/tuples/expected.json +7 -0
  453. data/golden/tuples/input.json +3 -0
  454. data/golden/tuples/schema.kumi +11 -0
  455. data/golden/tuples_and_arrays/expected/ast.txt +44 -0
  456. data/golden/tuples_and_arrays/expected/input_plan.txt +7 -0
  457. data/golden/tuples_and_arrays/expected/lir_00_unoptimized.txt +41 -0
  458. data/golden/tuples_and_arrays/expected/lir_01_hoist_scalar_references.txt +41 -0
  459. data/golden/tuples_and_arrays/expected/lir_02_inlined.txt +62 -0
  460. data/golden/tuples_and_arrays/expected/lir_03_cse.txt +51 -0
  461. data/golden/tuples_and_arrays/expected/lir_04_1_loop_fusion.txt +51 -0
  462. data/golden/tuples_and_arrays/expected/lir_04_loop_invcm.txt +51 -0
  463. data/golden/tuples_and_arrays/expected/lir_06_const_prop.txt +51 -0
  464. data/golden/tuples_and_arrays/expected/nast.txt +28 -0
  465. data/golden/tuples_and_arrays/expected/schema_javascript.mjs +58 -0
  466. data/golden/tuples_and_arrays/expected/schema_ruby.rb +88 -0
  467. data/golden/tuples_and_arrays/expected/snast.txt +28 -0
  468. data/golden/tuples_and_arrays/expected.json +18 -0
  469. data/golden/tuples_and_arrays/input.json +7 -0
  470. data/golden/tuples_and_arrays/schema.kumi +38 -0
  471. data/golden/with_constants/expected/ast.txt +28 -0
  472. data/golden/with_constants/expected/input_plan.txt +2 -0
  473. data/golden/with_constants/expected/lir_00_unoptimized.txt +17 -0
  474. data/golden/with_constants/expected/lir_01_hoist_scalar_references.txt +17 -0
  475. data/golden/with_constants/expected/lir_02_inlined.txt +17 -0
  476. data/golden/with_constants/expected/lir_03_cse.txt +17 -0
  477. data/golden/with_constants/expected/lir_04_1_loop_fusion.txt +17 -0
  478. data/golden/with_constants/expected/lir_04_loop_invcm.txt +17 -0
  479. data/golden/with_constants/expected/lir_06_const_prop.txt +17 -0
  480. data/golden/with_constants/expected/nast.txt +21 -0
  481. data/golden/with_constants/expected/schema_javascript.mjs +18 -0
  482. data/golden/with_constants/expected/schema_ruby.rb +44 -0
  483. data/golden/with_constants/expected/snast.txt +15 -0
  484. data/golden/with_constants/schema.kumi +10 -0
  485. data/lib/kumi/analyzer.rb +76 -24
  486. data/lib/kumi/configuration.rb +60 -0
  487. data/lib/kumi/core/analyzer/binder.rb +121 -0
  488. data/lib/kumi/core/analyzer/checkpoint.rb +15 -9
  489. data/lib/kumi/core/analyzer/constant_evaluator.rb +32 -37
  490. data/lib/kumi/core/analyzer/constant_folding_helpers.rb +55 -0
  491. data/lib/kumi/core/analyzer/debug.rb +14 -16
  492. data/lib/kumi/core/analyzer/fn_aliases.rb +46 -0
  493. data/lib/kumi/core/analyzer/folder.rb +94 -0
  494. data/lib/kumi/core/analyzer/macro_expander.rb +69 -0
  495. data/lib/kumi/core/analyzer/passes/assemble_irv2_pass.rb +130 -0
  496. data/lib/kumi/core/analyzer/passes/attach_anchors_pass.rb +71 -0
  497. data/lib/kumi/core/analyzer/passes/attach_terminal_info_pass.rb +181 -0
  498. data/lib/kumi/core/analyzer/passes/codegen/js/declaration_emitter.rb +317 -0
  499. data/lib/kumi/core/analyzer/passes/codegen/js/emitter.rb +75 -0
  500. data/lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb +103 -0
  501. data/lib/kumi/core/analyzer/passes/codegen/js_pass.rb +27 -0
  502. data/lib/kumi/core/analyzer/passes/codegen/ruby/declaration_emitter.rb +321 -0
  503. data/lib/kumi/core/analyzer/passes/codegen/ruby/emitter.rb +85 -0
  504. data/lib/kumi/core/analyzer/passes/codegen/ruby/output_buffer.rb +111 -0
  505. data/lib/kumi/core/analyzer/passes/codegen/ruby_pass.rb +32 -0
  506. data/lib/kumi/core/analyzer/passes/constant_folding_pass.rb +33 -0
  507. data/lib/kumi/core/analyzer/passes/contract_checker_pass.rb +220 -0
  508. data/lib/kumi/core/analyzer/passes/dependency_resolver.rb +5 -6
  509. data/lib/kumi/core/analyzer/passes/input_access_planner_pass.rb +7 -3
  510. data/lib/kumi/core/analyzer/passes/input_collector.rb +74 -122
  511. data/lib/kumi/core/analyzer/passes/input_form_schema_pass.rb +43 -0
  512. data/lib/kumi/core/analyzer/passes/ir_dependency_pass.rb +1 -1
  513. data/lib/kumi/core/analyzer/passes/ir_execution_schedule_pass.rb +1 -1
  514. data/lib/kumi/core/analyzer/passes/join_reduce_planning_pass.rb +21 -23
  515. data/lib/kumi/core/analyzer/passes/lir/constant_propagation_pass.rb +84 -0
  516. data/lib/kumi/core/analyzer/passes/lir/dead_code_elimination_pass.rb +93 -0
  517. data/lib/kumi/core/analyzer/passes/lir/hoist_scalar_references_pass.rb +115 -0
  518. data/lib/kumi/core/analyzer/passes/lir/inline_declarations_pass.rb +274 -0
  519. data/lib/kumi/core/analyzer/passes/lir/instruction_scheduling_pass.rb +198 -0
  520. data/lib/kumi/core/analyzer/passes/lir/kernel_binding_pass.rb +30 -0
  521. data/lib/kumi/core/analyzer/passes/lir/local_cse_pass.rb +121 -0
  522. data/lib/kumi/core/analyzer/passes/lir/loop_fusion_pass.rb +156 -0
  523. data/lib/kumi/core/analyzer/passes/lir/loop_invariant_code_motion_pass.rb +148 -0
  524. data/lib/kumi/core/analyzer/passes/lir/lower_pass.rb +407 -0
  525. data/lib/kumi/core/analyzer/passes/lir/stencil_emitter.rb +243 -0
  526. data/lib/kumi/core/analyzer/passes/lir/validation_pass.rb +83 -0
  527. data/lib/kumi/core/analyzer/passes/load_input_cse.rb +17 -16
  528. data/lib/kumi/core/analyzer/passes/lower_to_ir_pass.rb +4 -2
  529. data/lib/kumi/core/analyzer/passes/lower_to_irv2_pass.rb +197 -0
  530. data/lib/kumi/core/analyzer/passes/name_indexer.rb +4 -1
  531. data/lib/kumi/core/analyzer/passes/nast_dimensional_analyzer_pass.rb +237 -0
  532. data/lib/kumi/core/analyzer/passes/normalize_to_nast_pass.rb +156 -0
  533. data/lib/kumi/core/analyzer/passes/output_schema_pass.rb +38 -0
  534. data/lib/kumi/core/analyzer/passes/pass_base.rb +30 -4
  535. data/lib/kumi/core/analyzer/passes/precompute_access_paths_pass.rb +93 -0
  536. data/lib/kumi/core/analyzer/passes/scope_resolution_pass.rb +33 -30
  537. data/lib/kumi/core/analyzer/passes/semantic_constraint_validator.rb +5 -26
  538. data/lib/kumi/core/analyzer/passes/snast_pass.rb +229 -0
  539. data/lib/kumi/core/analyzer/passes/toposorter.rb +1 -0
  540. data/lib/kumi/core/analyzer/passes/type_checker.rb +13 -0
  541. data/lib/kumi/core/analyzer/passes/type_inferencer_pass.rb +14 -16
  542. data/lib/kumi/core/analyzer/passes/unsat_detector.rb +2 -1
  543. data/lib/kumi/core/analyzer/plans.rb +12 -0
  544. data/lib/kumi/core/analyzer/state_serde.rb +4 -4
  545. data/lib/kumi/core/analyzer/structs/access_plan.rb +2 -2
  546. data/lib/kumi/core/analyzer/unsat_constant_evaluator.rb +59 -0
  547. data/lib/kumi/core/compiler/access_codegen.rb +1 -1
  548. data/lib/kumi/core/compiler/access_emit/base.rb +9 -5
  549. data/lib/kumi/core/compiler/access_emit/each_indexed.rb +10 -3
  550. data/lib/kumi/core/compiler/access_emit/materialize.rb +12 -5
  551. data/lib/kumi/core/compiler/access_emit/ravel.rb +10 -3
  552. data/lib/kumi/core/compiler/access_emit/read.rb +4 -1
  553. data/lib/kumi/core/compiler/access_planner.rb +42 -4
  554. data/lib/kumi/core/compiler/access_planner_v2.rb +164 -0
  555. data/lib/kumi/core/explain.rb +18 -11
  556. data/lib/kumi/core/functions/loader.rb +47 -0
  557. data/lib/kumi/core/functions/model.rb +10 -0
  558. data/lib/kumi/core/functions/type_rules.rb +108 -0
  559. data/lib/kumi/core/ir/execution_engine/interpreter.rb +1 -1
  560. data/lib/kumi/core/ir/execution_engine/profiler.rb +107 -97
  561. data/lib/kumi/core/ir.rb +6 -2
  562. data/lib/kumi/core/irv2/builder.rb +48 -0
  563. data/lib/kumi/core/irv2/declaration.rb +28 -0
  564. data/lib/kumi/core/irv2/module.rb +108 -0
  565. data/lib/kumi/core/irv2/value.rb +28 -0
  566. data/lib/kumi/core/lir/analyze.rb +64 -0
  567. data/lib/kumi/core/lir/build.rb +363 -0
  568. data/lib/kumi/core/lir/emit.rb +62 -0
  569. data/lib/kumi/core/lir/structs/instruction.rb +44 -0
  570. data/lib/kumi/core/lir/structs/literal.rb +14 -0
  571. data/lib/kumi/core/lir/structs/stamp.rb +13 -0
  572. data/lib/kumi/core/lir/support/error.rb +9 -0
  573. data/lib/kumi/core/lir/support/ids.rb +34 -0
  574. data/lib/kumi/core/lir/validate.rb +74 -0
  575. data/lib/kumi/core/lir.rb +34 -0
  576. data/lib/kumi/core/nast.rb +216 -0
  577. data/lib/kumi/core/ruby_parser/dsl.rb +2 -2
  578. data/lib/kumi/core/ruby_parser/dsl_cascade_builder.rb +1 -1
  579. data/lib/kumi/core/ruby_parser/expression_converter.rb +10 -0
  580. data/lib/kumi/core/ruby_parser/input_builder.rb +16 -17
  581. data/lib/kumi/core/ruby_parser/schema_builder.rb +36 -10
  582. data/lib/kumi/core/ruby_parser/sugar.rb +64 -0
  583. data/lib/kumi/core/types/builder.rb +2 -2
  584. data/lib/kumi/core/types/normalizer.rb +2 -0
  585. data/lib/kumi/core/types/validator.rb +10 -3
  586. data/lib/kumi/core/types.rb +7 -0
  587. data/lib/kumi/dev/codegen.rb +194 -0
  588. data/lib/kumi/dev/golden/generator.rb +105 -0
  589. data/lib/kumi/dev/golden/reporter.rb +160 -0
  590. data/lib/kumi/dev/golden/representation.rb +45 -0
  591. data/lib/kumi/dev/golden/result.rb +98 -0
  592. data/lib/kumi/dev/golden/runtime_test.rb +93 -0
  593. data/lib/kumi/dev/golden/suite.rb +131 -0
  594. data/lib/kumi/dev/golden/verifier.rb +76 -0
  595. data/lib/kumi/dev/golden.rb +75 -0
  596. data/lib/kumi/dev/ir.rb +4 -4
  597. data/lib/kumi/dev/parse.rb +1 -1
  598. data/lib/kumi/dev/pretty_printer.rb +229 -0
  599. data/lib/kumi/dev/printer/irv2_formatter.rb +163 -0
  600. data/lib/kumi/dev/printer/width_aware_json.rb +44 -0
  601. data/lib/kumi/dev/profile_aggregator.rb +36 -38
  602. data/lib/kumi/dev/profile_runner.rb +19 -23
  603. data/lib/kumi/dev/runner.rb +12 -22
  604. data/lib/kumi/dev/support/kumi_runner.mjs +39 -0
  605. data/lib/kumi/dev.rb +3 -3
  606. data/lib/kumi/frontends/ruby.rb +12 -12
  607. data/lib/kumi/frontends/text.rb +26 -21
  608. data/lib/kumi/frontends.rb +6 -8
  609. data/lib/kumi/kernel_registry.rb +59 -0
  610. data/lib/kumi/pack/builder.rb +229 -0
  611. data/lib/kumi/pack.rb +15 -0
  612. data/lib/kumi/registry_v2/loader.rb +81 -0
  613. data/lib/kumi/registry_v2.rb +118 -0
  614. data/lib/kumi/schema.rb +83 -43
  615. data/lib/kumi/support/diff.rb +3 -2
  616. data/lib/kumi/support/ir_render.rb +1 -1
  617. data/lib/kumi/support/lir_printer.rb +143 -0
  618. data/lib/kumi/support/nast_printer.rb +93 -0
  619. data/lib/kumi/support/s_expression_printer.rb +5 -4
  620. data/lib/kumi/support/snast_printer.rb +111 -0
  621. data/lib/kumi/syntax/call_expression.rb +1 -1
  622. data/lib/kumi/syntax/input_declaration.rb +2 -2
  623. data/lib/kumi/syntax/node.rb +4 -12
  624. data/lib/kumi/syntax/root.rb +10 -0
  625. data/lib/kumi/syntax/trait_declaration.rb +1 -0
  626. data/lib/kumi/syntax/value_declaration.rb +1 -0
  627. data/lib/kumi/version.rb +1 -1
  628. data/lib/kumi.rb +47 -5
  629. metadata +571 -54
  630. data/docs/AST.md +0 -133
  631. data/docs/DSL.md +0 -154
  632. data/docs/FUNCTIONS.md +0 -176
  633. data/docs/VECTOR_SEMANTICS.md +0 -286
  634. data/docs/compiler_design_principles.md +0 -86
  635. data/docs/dev/analyzer-debug.md +0 -52
  636. data/docs/dev/parse-command.md +0 -64
  637. data/docs/dev/vm-profiling.md +0 -95
  638. data/docs/development/README.md +0 -120
  639. data/docs/development/error-reporting.md +0 -361
  640. data/docs/features/README.md +0 -58
  641. data/docs/features/analysis-type-inference.md +0 -42
  642. data/docs/features/analysis-unsat-detection.md +0 -71
  643. data/docs/features/hierarchical-broadcasting.md +0 -415
  644. data/docs/features/input-declaration-system.md +0 -58
  645. data/docs/features/performance.md +0 -14
  646. data/docs/features/s-expression-printer.md +0 -77
  647. data/docs/schema_metadata/broadcasts.md +0 -53
  648. data/docs/schema_metadata/cascades.md +0 -45
  649. data/docs/schema_metadata/declarations.md +0 -54
  650. data/docs/schema_metadata/dependencies.md +0 -57
  651. data/docs/schema_metadata/evaluation_order.md +0 -29
  652. data/docs/schema_metadata/examples.md +0 -95
  653. data/docs/schema_metadata/inferred_types.md +0 -46
  654. data/docs/schema_metadata/inputs.md +0 -86
  655. data/docs/schema_metadata.md +0 -108
  656. data/golden/mixed_nesting/schema.kumi +0 -42
  657. data/lib/kumi/core/function_registry/collection_functions.rb +0 -298
  658. data/lib/kumi/core/function_registry/comparison_functions.rb +0 -33
  659. data/lib/kumi/core/function_registry/conditional_functions.rb +0 -48
  660. data/lib/kumi/core/function_registry/function_builder.rb +0 -184
  661. data/lib/kumi/core/function_registry/logical_functions.rb +0 -214
  662. data/lib/kumi/core/function_registry/math_functions.rb +0 -74
  663. data/lib/kumi/core/function_registry/stat_functions.rb +0 -156
  664. data/lib/kumi/core/function_registry/string_functions.rb +0 -57
  665. data/lib/kumi/core/function_registry/type_functions.rb +0 -53
  666. data/lib/kumi/core/function_registry.rb +0 -176
  667. data/lib/kumi/registry.rb +0 -32
  668. data/lib/kumi/runtime/executable.rb +0 -135
  669. data/lib/kumi/runtime/run.rb +0 -105
  670. data/performance_results.txt +0 -63
  671. data/scripts/analyze_broadcast_methods.rb +0 -68
  672. data/scripts/analyze_cascade_methods.rb +0 -74
  673. data/scripts/check_broadcasting_coverage.rb +0 -51
  674. data/scripts/find_dead_code.rb +0 -114
  675. data/scripts/generate_function_docs.rb +0 -71
  676. data/scripts/test_mixed_nesting_performance.rb +0 -206
@@ -0,0 +1,229 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kumi
4
+ module Core
5
+ module Analyzer
6
+ module Passes
7
+ # Semantic NAST Pass (SNAST)
8
+ # - Rewrites intrinsic control and reductions into first-class nodes.
9
+ # - Attaches semantic stamps to every node: meta[:stamp] = { axes:, dtype: }.
10
+ # - Uses side tables for types/scopes; no meta[:plan].
11
+ #
12
+ # Reduction rule (default sugar):
13
+ # If not explicitly annotated, a reduction over arguments reduces the LAST axis:
14
+ # a = lub_by_prefix(arg_axes_list)
15
+ # over = [a.last]; out_axes = a[0...-1]
16
+ #
17
+ # Inputs (state):
18
+ # :nast_module => Kumi::Core::NAST::Module (topologically ordered)
19
+ # :metadata_table => Hash[node_key => { result_scope:, result_type:, arg_scopes?: ... }]
20
+ # :declaration_table => Hash[name => { result_scope:, result_type: }]
21
+ # :input_table => [{path_fqn:, axes:, dtype:}] or Hash[path_fqn] => { axes:, dtype: }
22
+ #
23
+ # Output (state):
24
+ # :snast_module => Kumi::Core::NAST::Module (with NAST::Select / NAST::Reduce nodes)
25
+ #
26
+ # TODO: If downstream never keys by node ids, consider removing dependence on node.id.
27
+ # TODO: Use Error helpers with provenance
28
+ class SNASTPass < PassBase
29
+ def run(errors)
30
+ @nast_module = get_state(:nast_module, required: true)
31
+ @metadata_table = get_state(:metadata_table, required: true)
32
+ @declaration_table = get_state(:declaration_table, required: true)
33
+ @input_table = get_state(:input_table, required: true)
34
+ @index_table = get_state(:index_table, required: true)
35
+ @registry = get_state(:registry, required: true)
36
+ @errors = errors
37
+
38
+ debug "Building SNAST from #{@nast_module.decls.size} declarations"
39
+ snast_module = @nast_module.accept(self)
40
+ state.with(:snast_module, snast_module.freeze)
41
+ end
42
+
43
+ # ---------- Visitor entry points ----------
44
+
45
+ def visit_module(mod)
46
+ # decls is expected to be a Hash[name => Declaration]
47
+ mod.class.new(decls: mod.decls.transform_values { |d| d.accept(self) })
48
+ end
49
+
50
+ def visit_declaration(d)
51
+ meta = @declaration_table.fetch(d.name)
52
+ body = d.body.accept(self)
53
+ out = d.class.new(id: d.id, name: d.name, body:, loc: d.loc, meta: { kind: d.kind })
54
+ stamp!(out, meta[:result_scope], meta[:result_type])
55
+ end
56
+
57
+ # ---------- Leaves ----------
58
+
59
+ def visit_const(n)
60
+ meta = meta_for(n)
61
+ out = n.class.new(id: n.id, value: n.value, loc: n.loc)
62
+ stamp!(out, [], meta[:type])
63
+ end
64
+
65
+ def visit_input_ref(n)
66
+ ent = lookup_input(n.path_fqn)
67
+ out = n.class.new(id: n.id, path: n.path, loc: n.loc)
68
+ stamp!(out, ent[:axes], ent[:dtype])
69
+ end
70
+
71
+ def visit_index_ref(n)
72
+ m = meta_for(n)
73
+ out = n.class.new(id: n.id, name: n.name, input_fqn: n.input_fqn, loc: n.loc)
74
+ stamp!(out, m[:scope], m[:type])
75
+ end
76
+
77
+ def visit_ref(n)
78
+ m = meta_for(n)
79
+ out = n.class.new(id: n.id, name: n.name, loc: n.loc)
80
+ stamp!(out, m[:result_scope], m[:result_type])
81
+ end
82
+
83
+ def visit_tuple(n)
84
+ args = n.args.map { _1.accept(self) }
85
+ m = meta_for(n)
86
+ out = n.class.new(id: n.id, args:, loc: n.loc)
87
+ stamp!(out, m[:result_scope], m[:result_type])
88
+ end
89
+
90
+ def visit_hash(n)
91
+ pairs = n.pairs.map { _1.accept(self) }
92
+ m = meta_for(n)
93
+ out = n.class.new(id: n.id, pairs:, loc: n.loc)
94
+ stamp!(out, m[:scope], m[:type])
95
+ end
96
+
97
+ def visit_pair(n)
98
+ value = n.value.accept(self)
99
+ m = meta_for(n)
100
+ out = n.class.new(id: n.id, key: n.key, value:)
101
+ stamp!(out, m[:scope], m[:type])
102
+ end
103
+
104
+ def visit_call(n)
105
+ if @registry.function_select?(n.fn)
106
+ c = n.args[0].accept(self)
107
+ t = n.args[1].accept(self)
108
+ f = n.args[2].accept(self)
109
+ target_axes = lub_by_prefix([axes_of(t), axes_of(f)])
110
+ target_axes = axes_of(c) if target_axes.empty?
111
+ unless prefix?(axes_of(c), target_axes)
112
+ raise Kumi::Core::Errors::SemanticError,
113
+ "select mask axes #{axes_of(c).inspect} must prefix #{target_axes.inspect} at: #{n.loc}"
114
+ end
115
+
116
+ out = NAST::Select.new(id: n.id, cond: c, on_true: t, on_false: f, loc: n.loc, meta: n.meta.dup)
117
+ return stamp!(out, target_axes, dtype_of(t))
118
+ end
119
+
120
+ if @registry.function_reduce?(n.fn)
121
+ raise "Reducers should only have one arg" if n.args.size != 1 # TODO: -> sugar to collapse variadics?
122
+
123
+ arg_node = n.args.first
124
+ visited_arg = arg_node.accept(self)
125
+ arg_meta = visited_arg[:meta]
126
+ arg_type = arg_meta[:stamp][:dtype]
127
+
128
+ if Kumi::Core::Types.collection?(arg_type)
129
+ # --- Path for FOLD (Scalar or Vectorized) ---w
130
+ # The argument is semantically a tuple. Create a Fold node.
131
+
132
+ # We still need to visit the child node to build the SNAST tree
133
+
134
+ fold_node = NAST::Fold.new(
135
+ id: n.id,
136
+ fn: @registry.resolve_function(n.fn),
137
+ arg: visited_arg, # The arg is the tuple/reference to the tuple
138
+ loc: n.loc,
139
+ meta: n.meta.dup
140
+ )
141
+
142
+ # The output type is the reduced scalar type (e.g., :integer for max).
143
+ # The axes are PRESERVED because a fold is an element-wise operation
144
+ # on the container of tuples.
145
+ result_meta = meta_for(n)
146
+ return stamp!(fold_node, result_meta[:result_scope], result_meta[:result_type])
147
+ else
148
+ # --- Path for REDUCE (Vectorized Arrays) ---
149
+ in_axes = axes_of(visited_arg)
150
+
151
+ if in_axes.empty?
152
+ raise Kumi::Core::Errors::SemanticError,
153
+ "reduce function called on a non-collection scalar: #{arg_type}"
154
+ end
155
+
156
+ result_meta = meta_for(n)
157
+ out_axes = Array(result_meta[:result_scope])
158
+
159
+ raise Kumi::Core::Errors::SemanticError, "reduce: out axes must prefix arg axes" unless prefix?(out_axes, in_axes)
160
+
161
+ over_axes = in_axes.drop(out_axes.length)
162
+ reduce_node = NAST::Reduce.new(
163
+ id: n.id,
164
+ fn: @registry.resolve_function(n.fn),
165
+ over: over_axes,
166
+ arg: visited_arg,
167
+ loc: n.loc,
168
+ meta: n.meta.dup
169
+ )
170
+ return stamp!(reduce_node, out_axes, result_meta[:result_type])
171
+ end
172
+ end
173
+
174
+ # regular elementwise
175
+ args = n.args.map { _1.accept(self) }
176
+ m = meta_for(n)
177
+ out = n.class.new(id: n.id, fn: @registry.resolve_function(n.fn), args:, opts: n.opts, loc: n.loc)
178
+ stamp!(out, m[:result_scope], m[:result_type])
179
+ end
180
+
181
+ # ---------- Helpers ----------
182
+
183
+ def stamp!(node, axes, dtype)
184
+ node.meta[:stamp] = { axes: Array(axes), dtype: dtype }.freeze
185
+ node
186
+ end
187
+
188
+ def meta_for(node) = @metadata_table.fetch(node_key(node))
189
+ def axes_of(n) = Array(n.meta[:stamp]&.dig(:axes))
190
+ def dtype_of(n) = n.meta[:stamp]&.dig(:dtype)
191
+
192
+ # Least upper bound by prefix. All entries must be a prefix of the longest.
193
+ def lub_by_prefix(list)
194
+ return [] if list.empty?
195
+
196
+ cand = list.max_by(&:length) || []
197
+ list.each do |ax|
198
+ raise Kumi::Core::Errors::SemanticError, "prefix mismatch: #{ax.inspect} vs #{cand.inspect}" unless prefix?(ax, cand)
199
+ end
200
+ cand
201
+ end
202
+
203
+ def prefix?(pre, full)
204
+ pre.each_with_index.all? { |tok, i| full[i] == tok }
205
+ end
206
+
207
+ # Default reduce sugar: over last axis of the LUB of argument axes.
208
+ # Returns { over:, out_axes: }.
209
+ def reduce_last_axis(args_axes_list)
210
+ a = lub_by_prefix(args_axes_list)
211
+ raise Kumi::Core::Errors::SemanticError, "cannot reduce scalar" if a.empty?
212
+
213
+ { over: [a.last], out_axes: a[0...-1] }
214
+ end
215
+
216
+ def lookup_input(fqn)
217
+ if @input_table.respond_to?(:find)
218
+ @input_table.find { |x| x[:path_fqn] == fqn } || raise("Input not found for #{fqn}")
219
+ else
220
+ @input_table.fetch(fqn) { raise("Input not found for #{fqn}") }
221
+ end
222
+ end
223
+
224
+ def node_key(n) = "#{n.class}_#{n.id}"
225
+ end
226
+ end
227
+ end
228
+ end
229
+ end
@@ -14,6 +14,7 @@ module Kumi
14
14
  definitions = get_state(:declarations, required: false) || {}
15
15
 
16
16
  order = compute_topological_order(dependency_graph, definitions, errors)
17
+
17
18
  state.with(:evaluation_order, order)
18
19
  end
19
20
 
@@ -11,6 +11,7 @@ module Kumi
11
11
  class TypeChecker < VisitorPass
12
12
  def run(errors)
13
13
  functions_required = Set.new
14
+ @registry = state[:registry]
14
15
 
15
16
  visit_nodes_of_type(Kumi::Syntax::CallExpression, errors: errors) do |node, _decl, errs|
16
17
  validate_function_call(node, errs)
@@ -31,6 +32,18 @@ module Kumi
31
32
  end
32
33
 
33
34
  def get_function_signature(node, errors)
35
+ func = begin
36
+ @registry.function(node.fn_name)
37
+ rescue StandardError
38
+ nil
39
+ end
40
+ if func
41
+ return {
42
+ arity: func.params.size,
43
+ param_types: func.params.map { |p| p["type"] ? Kumi::Core::Types.parse(p["type"]) : nil }
44
+ }
45
+ end
46
+
34
47
  Kumi::Registry.signature(node.fn_name)
35
48
  rescue Kumi::Errors::UnknownFunction
36
49
  # Use old format for backward compatibility, but node.loc provides better location
@@ -22,20 +22,18 @@ module Kumi
22
22
  decl = definitions[name]
23
23
  next unless decl
24
24
 
25
- begin
26
- # Check if this declaration is marked as vectorized
27
- if broadcast_meta[:vectorized_operations]&.key?(name)
28
- # Infer the element type and wrap in array
29
- element_type = infer_vectorized_element_type(decl.expression, types, broadcast_meta)
30
- types[name] = decl.is_a?(Kumi::Syntax::TraitDeclaration) ? { array: :boolean } : { array: element_type }
31
- else
32
- # Normal type inference
33
- inferred_type = infer_expression_type(decl.expression, types, broadcast_meta, name)
34
- types[name] = inferred_type
35
- end
36
- rescue StandardError => e
37
- report_type_error(errors, "Type inference failed: #{e.message}", location: decl&.loc)
25
+ # Check if this declaration is marked as vectorized
26
+ if broadcast_meta[:vectorized_operations]&.key?(name)
27
+ # Infer the element type and wrap in array
28
+ element_type = infer_vectorized_element_type(decl.expression, types, broadcast_meta)
29
+ types[name] = decl.is_a?(Kumi::Syntax::TraitDeclaration) ? { array: :boolean } : { array: element_type }
30
+ else
31
+ # Normal type inference
32
+ inferred_type = infer_expression_type(decl.expression, types, broadcast_meta, name)
33
+ types[name] = inferred_type
38
34
  end
35
+ # rescue StandardError => e
36
+ # report_type_error(errors, "Type inference failed: #{e.message}", location: decl&.loc)
39
37
  end
40
38
 
41
39
  state.with(:inferred_types, types)
@@ -108,9 +106,9 @@ module Kumi
108
106
  expected_type = param_types[i] || param_types.last
109
107
  next if expected_type.nil?
110
108
 
111
- unless Types.compatible?(arg_type, expected_type)
112
- # Could add warning here in future, but for now just infer best type
113
- end
109
+ # unless Types.compatible?(arg_type, expected_type)
110
+ # Could add warning here in future, but for now just infer best type
111
+ # end
114
112
  end
115
113
  end
116
114
 
@@ -14,10 +14,11 @@ module Kumi
14
14
  Atom = Kumi::Core::AtomUnsatSolver::Atom
15
15
 
16
16
  def run(errors)
17
+ return state
17
18
  definitions = get_state(:declarations)
18
19
  @input_meta = get_state(:input_metadata) || {}
19
20
  @definitions = definitions
20
- @evaluator = ConstantEvaluator.new(definitions)
21
+ @evaluator = UnsatConstantEvaluator.new(definitions)
21
22
 
22
23
  each_decl do |decl|
23
24
  if decl.expression.is_a?(CascadeExpression)
@@ -46,6 +46,18 @@ module Kumi
46
46
  !total_reduction?
47
47
  end
48
48
  end
49
+
50
+ InputPlan = Struct.new(
51
+ :source_path, # Array<Symbol>
52
+ :axes, # Array<Symbol> (logical site axes)
53
+ :dtype, # Symbol/String
54
+ :key_policy, # Symbol
55
+ :missing_policy, # Symbol
56
+ :navigation_steps, # Array<Hash> [{axis:, kind:, key:, alias:, loop_idx:, ...}]
57
+ :path_fqn, # String "a.b.c"
58
+ :open_axis,
59
+ keyword_init: true
60
+ )
49
61
  end
50
62
  end
51
63
  end
@@ -26,7 +26,7 @@ module Kumi
26
26
  end
27
27
 
28
28
  def load_json(json_str)
29
- h = JSON.parse(json_str) # Don't symbolize keys - let decode_json_safe handle it
29
+ h = JSON.parse(json_str) # Don't symbolize keys - let decode_json_safe handle it
30
30
  ::Kumi::Core::Analyzer::AnalysisState.new(decode_json_safe(h))
31
31
  end
32
32
 
@@ -49,8 +49,8 @@ module Kumi
49
49
  # Check for special encoding markers first (before key transformation)
50
50
  if x.key?("$sym") then x["$sym"].to_sym
51
51
  elsif x.key?("$set") then Set.new(x["$set"].map { |item| decode_json_safe(item) })
52
- elsif x.key?("$ir") then x["$ir"] # Keep as string inspection for JSON round-trip
53
- else
52
+ elsif x.key?("$ir") then x["$ir"] # Keep as string inspection for JSON round-trip
53
+ else
54
54
  # Regular hash - transform keys to symbols and recursively decode values
55
55
  x.transform_keys(&:to_sym).transform_values { |value| decode_json_safe(value) }
56
56
  end
@@ -61,4 +61,4 @@ module Kumi
61
61
  end
62
62
  end
63
63
  end
64
- end
64
+ end
@@ -6,8 +6,8 @@ module Kumi
6
6
  module Structs
7
7
  # One plan for a specific path and mode (path:mode)
8
8
  AccessPlan = Struct.new(:path, :containers, :leaf, :scope, :depth, :mode,
9
- :on_missing, :key_policy, :operations, keyword_init: true) do
10
- def initialize(path:, containers:, leaf:, scope:, depth:, mode:, on_missing:, key_policy:, operations:)
9
+ :on_missing, :key_policy, :operations, :chain, keyword_init: true) do
10
+ def initialize(path:, containers:, leaf:, scope:, depth:, mode:, on_missing:, key_policy:, operations:, chain:)
11
11
  super
12
12
  freeze
13
13
  end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kumi
4
+ module Core
5
+ module Analyzer
6
+ class UnsatConstantEvaluator
7
+ include Syntax
8
+
9
+ def initialize(definitions)
10
+ @definitions = definitions
11
+ @memo = {}
12
+ end
13
+
14
+ OPERATORS = {
15
+ add: :+,
16
+ subtract: :-,
17
+ multiply: :*,
18
+ divide: :/
19
+ }.freeze
20
+
21
+ def evaluate(node, visited = Set.new)
22
+ return :unknown unless node
23
+ return @memo[node] if @memo.key?(node)
24
+ return node.value if node.is_a?(Literal)
25
+
26
+ result = case node
27
+ when DeclarationReference then evaluate_binding(node, visited)
28
+ when CallExpression then evaluate_call_expression(node, visited)
29
+ else :unknown
30
+ end
31
+
32
+ @memo[node] = result unless result == :unknown
33
+ result
34
+ end
35
+
36
+ private
37
+
38
+ def evaluate_binding(node, visited)
39
+ return :unknown if visited.include?(node.name)
40
+
41
+ visited << node.name
42
+ definition = @definitions[node.name]
43
+ return :unknown unless definition
44
+
45
+ evaluate(definition.expression, visited)
46
+ end
47
+
48
+ def evaluate_call_expression(node, visited)
49
+ return :unknown unless OPERATORS.key?(node.fn_name)
50
+
51
+ args = node.args.map { |arg| evaluate(arg, visited) }
52
+ return :unknown if args.any?(:unknown)
53
+
54
+ args.reduce(OPERATORS[node.fn_name])
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -58,4 +58,4 @@ module Kumi
58
58
  end
59
59
  end
60
60
  end
61
- end
61
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Kumi
3
4
  module Core
4
5
  module Compiler
@@ -8,7 +9,8 @@ module Kumi
8
9
 
9
10
  # ---------- IR segmentation ----------
10
11
  def segment_ops(ops)
11
- segs, cur = [], []
12
+ segs = []
13
+ cur = []
12
14
  i = 0
13
15
  while i < ops.length
14
16
  case ops[i][:type]
@@ -107,15 +109,17 @@ module Kumi
107
109
  end
108
110
  else # :materialize, :read
109
111
  # Important: for :materialize this is ALWAYS nil (never [])
110
- return_val = 'nil'
112
+ return_val = "nil"
111
113
  map_depth.positive? ? "next #{return_val}" : "return #{return_val}"
112
114
  end
113
115
  when :skip
114
116
  if mode == :materialize
115
- return_val = preview_array ? '[]' : 'nil'
117
+ return_val = preview_array ? "[]" : "nil"
116
118
  map_depth.positive? ? "next #{return_val}" : "return #{return_val}"
119
+ elsif map_depth.positive?
120
+ "next"
117
121
  else
118
- map_depth.positive? ? "next" : (mode == :each_indexed ? "if block; return nil; else; return out; end" : "return out")
122
+ (mode == :each_indexed ? "if block; return nil; else; return out; end" : "return out")
119
123
  end
120
124
  else # :error
121
125
  %(raise KeyError, "Missing key '#{key}' at '#{path_key}' (#{mode})")
@@ -170,4 +174,4 @@ module Kumi
170
174
  end
171
175
  end
172
176
  end
173
- end
177
+ end
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Kumi::Core::Compiler::AccessEmit
3
4
  module EachIndexed
4
5
  extend Base
6
+
5
7
  module_function
8
+
6
9
  def build(plan)
7
10
  policy = plan.on_missing || :error
8
11
  key_policy = plan.key_policy || :indifferent
@@ -13,7 +16,9 @@ module Kumi::Core::Compiler::AccessEmit
13
16
  code << " out = []\n"
14
17
  code << " node0 = data\n"
15
18
  code << " idx_vec = []\n"
16
- nodev, depth, loop_depth = "node0", 0, 0
19
+ nodev = "node0"
20
+ depth = 0
21
+ loop_depth = 0
17
22
 
18
23
  segs.each do |seg|
19
24
  if seg == :array
@@ -25,7 +30,9 @@ module Kumi::Core::Compiler::AccessEmit
25
30
  code << " idx_vec[#{loop_depth}] = i#{loop_depth}\n"
26
31
  child = "node#{depth + 1}"
27
32
  code << " #{child} = ary#{loop_depth}[i#{loop_depth}]\n"
28
- nodev = child; depth += 1; loop_depth += 1
33
+ nodev = child
34
+ depth += 1
35
+ loop_depth += 1
29
36
  else
30
37
  seg.each do |(_, key, preview)|
31
38
  code << fetch_hash_code(node_var: nodev, key: key, key_policy: key_policy,
@@ -53,4 +60,4 @@ module Kumi::Core::Compiler::AccessEmit
53
60
  code
54
61
  end
55
62
  end
56
- end
63
+ end
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Kumi::Core::Compiler::AccessEmit
3
4
  module Materialize
4
5
  extend Base
6
+
5
7
  module_function
8
+
6
9
  def build(plan)
7
10
  policy = plan.on_missing || :error
8
11
  key_policy = plan.key_policy || :indifferent
@@ -10,7 +13,9 @@ module Kumi::Core::Compiler::AccessEmit
10
13
  segs = segment_ops(plan.operations)
11
14
 
12
15
  code = +"lambda do |data|\n"
13
- nodev, depth, map_depth = "node0", 0, 0
16
+ nodev = "node0"
17
+ depth = 0
18
+ map_depth = 0
14
19
  code << " #{nodev} = data\n"
15
20
 
16
21
  segs.each do |seg|
@@ -19,7 +24,9 @@ module Kumi::Core::Compiler::AccessEmit
19
24
  child = "node#{depth + 1}"
20
25
  code << " #{nodev} = #{nodev}.map do |__e#{depth}|\n"
21
26
  code << " #{child} = __e#{depth}\n"
22
- nodev = child; depth += 1; map_depth += 1
27
+ nodev = child
28
+ depth += 1
29
+ map_depth += 1
23
30
  else
24
31
  seg.each do |(_, key, preview)|
25
32
  code << " "
@@ -32,8 +39,8 @@ module Kumi::Core::Compiler::AccessEmit
32
39
  end
33
40
 
34
41
  while map_depth.positive?
35
- code << " " * map_depth + "#{nodev}\n"
36
- code << " " * (map_depth - 1) + "end\n"
42
+ code << ((" " * map_depth) + "#{nodev}\n")
43
+ code << ((" " * (map_depth - 1)) + "end\n")
37
44
  nodev = "node#{depth - 1}"
38
45
  depth -= 1
39
46
  map_depth -= 1
@@ -42,4 +49,4 @@ module Kumi::Core::Compiler::AccessEmit
42
49
  code
43
50
  end
44
51
  end
45
- end
52
+ end
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Kumi::Core::Compiler::AccessEmit
3
4
  module Ravel
4
5
  extend Base
6
+
5
7
  module_function
8
+
6
9
  def build(plan)
7
10
  policy = plan.on_missing || :error
8
11
  key_policy = plan.key_policy || :indifferent
@@ -11,7 +14,9 @@ module Kumi::Core::Compiler::AccessEmit
11
14
 
12
15
  code = +"lambda do |data|\n"
13
16
  code << " out = []\n"
14
- nodev, depth, loop_depth = "node0", 0, 0
17
+ nodev = "node0"
18
+ depth = 0
19
+ loop_depth = 0
15
20
  code << " #{nodev} = data\n"
16
21
 
17
22
  segs.each do |seg|
@@ -23,7 +28,9 @@ module Kumi::Core::Compiler::AccessEmit
23
28
  code << " while (i#{loop_depth} += 1) < len#{loop_depth}\n"
24
29
  child = "node#{depth + 1}"
25
30
  code << " #{child} = ary#{loop_depth}[i#{loop_depth}]\n"
26
- nodev = child; depth += 1; loop_depth += 1
31
+ nodev = child
32
+ depth += 1
33
+ loop_depth += 1
27
34
  else
28
35
  seg.each do |(_, key, preview)|
29
36
  code << " "
@@ -47,4 +54,4 @@ module Kumi::Core::Compiler::AccessEmit
47
54
  code
48
55
  end
49
56
  end
50
- end
57
+ end
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Kumi::Core::Compiler::AccessEmit
3
4
  module Read
4
5
  extend Base
6
+
5
7
  module_function
8
+
6
9
  def build(plan)
7
10
  policy = plan.on_missing || :error
8
11
  key_policy = plan.key_policy || :indifferent
@@ -29,4 +32,4 @@ module Kumi::Core::Compiler::AccessEmit
29
32
  RUBY
30
33
  end
31
34
  end
32
- end
35
+ end