solve-engine 1.1.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/README.md +12 -17
  2. package/dist/{BytecodeBuilder-Bp9xeTmX.d.cts → BytecodeBuilder-DGGeByAP.d.cts} +18 -0
  3. package/dist/{BytecodeBuilder-Bp9xeTmX.d.ts → BytecodeBuilder-DGGeByAP.d.ts} +18 -0
  4. package/dist/{Configuration-C9W8tJv_.d.cts → Configuration-B6W0-T67.d.cts} +17 -4
  5. package/dist/{Configuration-C9W8tJv_.d.ts → Configuration-B6W0-T67.d.ts} +17 -4
  6. package/dist/{EngineError-B61GS1jp.d.cts → EngineError-Ce1lPkjZ.d.cts} +8 -0
  7. package/dist/{EngineError-B61GS1jp.d.ts → EngineError-Ce1lPkjZ.d.ts} +8 -0
  8. package/dist/{Lexer-BOs7euZe.d.cts → Lexer-B4C1qHXu.d.cts} +1 -1
  9. package/dist/{Lexer-CSI_lwbW.d.ts → Lexer-DKMlj7Sy.d.ts} +1 -1
  10. package/dist/{PackageCompatibility-B-7rK1TD.d.cts → PackageCompatibility-Bn5jnBtA.d.cts} +2 -2
  11. package/dist/{PackageCompatibility-Dh59eF-X.d.ts → PackageCompatibility-CIvq2MP5.d.ts} +2 -2
  12. package/dist/{PackageRegistry-_8rDlvxI.d.ts → PackageRegistry-DzeiWcv4.d.ts} +143 -175
  13. package/dist/{PackageRegistry-BHWJP83F.d.cts → PackageRegistry-dpdurBVO.d.cts} +143 -175
  14. package/dist/{Parselet-BBT8riYh.d.ts → Parselet-B-zoPrTa.d.ts} +9 -6
  15. package/dist/{Parselet-BHcgK9S7.d.cts → Parselet-C4Wu055_.d.cts} +9 -6
  16. package/dist/{ScopeManager-CxA24W5n.d.ts → ScopeManager-C2LDOrDx.d.ts} +14 -16
  17. package/dist/{ScopeManager-8vf02dwj.d.cts → ScopeManager-D7uMXbhS.d.cts} +14 -16
  18. package/dist/{Token-B1hdkedD.d.cts → Token-CbP_OutD.d.cts} +9 -0
  19. package/dist/{Token-B1hdkedD.d.ts → Token-CbP_OutD.d.ts} +9 -0
  20. package/dist/{TokenNormalizer-C6VzZgHa.d.ts → TokenNormalizer-DCWdZjGz.d.ts} +1 -1
  21. package/dist/{TokenNormalizer-DRc1Js1V.d.cts → TokenNormalizer-DnlL7_8c.d.cts} +1 -1
  22. package/dist/{VMCheckpoints-MK--EBH2.d.ts → VMCheckpoints-CGyFhivM.d.ts} +3 -3
  23. package/dist/{VMCheckpoints-ELYqITdF.d.cts → VMCheckpoints-I9jg3jWR.d.cts} +3 -3
  24. package/dist/{Value-BUi1RA3S.d.cts → Value-CCi_Eecs.d.cts} +72 -5
  25. package/dist/{Value-BUi1RA3S.d.ts → Value-CCi_Eecs.d.ts} +72 -5
  26. package/dist/{WorkerError-gzmaopj2.d.cts → WorkerError-B4p6PNfx.d.cts} +1 -1
  27. package/dist/{WorkerError-_-RkoQ5P.d.ts → WorkerError-Dhj9BQ_A.d.ts} +1 -1
  28. package/dist/chunk-2JMFUQZH.js +2 -0
  29. package/dist/chunk-2JMFUQZH.js.map +1 -0
  30. package/dist/chunk-2RWAXT6O.js +0 -1
  31. package/dist/chunk-4BZIYU7S.cjs +3 -0
  32. package/dist/chunk-4BZIYU7S.cjs.map +1 -0
  33. package/dist/chunk-4J7XZSZJ.cjs +5 -0
  34. package/dist/chunk-4J7XZSZJ.cjs.map +1 -0
  35. package/dist/chunk-4QVBSG6B.cjs +2 -0
  36. package/dist/chunk-4QVBSG6B.cjs.map +1 -0
  37. package/dist/chunk-5IJD5L3O.cjs +2 -0
  38. package/dist/chunk-5IJD5L3O.cjs.map +1 -0
  39. package/dist/chunk-62LMTO4F.js +2 -0
  40. package/dist/chunk-62LMTO4F.js.map +1 -0
  41. package/dist/chunk-6CY44ZPG.js +2 -0
  42. package/dist/chunk-6CY44ZPG.js.map +1 -0
  43. package/dist/chunk-6G3PMEPA.js +2 -0
  44. package/dist/chunk-6G3PMEPA.js.map +1 -0
  45. package/dist/chunk-6INX773F.cjs +2 -0
  46. package/dist/chunk-6INX773F.cjs.map +1 -0
  47. package/dist/chunk-6KFVG6UY.cjs +2 -0
  48. package/dist/chunk-6KFVG6UY.cjs.map +1 -0
  49. package/dist/chunk-76F3LCIL.js +4 -0
  50. package/dist/chunk-76F3LCIL.js.map +1 -0
  51. package/dist/chunk-7GK3XEZF.js +2 -0
  52. package/dist/chunk-7GK3XEZF.js.map +1 -0
  53. package/dist/chunk-APN442VD.cjs +2 -0
  54. package/dist/chunk-APN442VD.cjs.map +1 -0
  55. package/dist/chunk-AXMQG5TS.cjs +2 -0
  56. package/dist/chunk-AXMQG5TS.cjs.map +1 -0
  57. package/dist/chunk-CIQOK7Q4.cjs +2 -0
  58. package/dist/chunk-CIQOK7Q4.cjs.map +1 -0
  59. package/dist/chunk-E6Z4NQAS.js +2 -0
  60. package/dist/chunk-E6Z4NQAS.js.map +1 -0
  61. package/dist/chunk-EFJCC6FJ.cjs +2 -0
  62. package/dist/chunk-EFJCC6FJ.cjs.map +1 -0
  63. package/dist/chunk-ESUN2THE.cjs +2 -0
  64. package/dist/chunk-ESUN2THE.cjs.map +1 -0
  65. package/dist/chunk-EVAOPEO4.js +2 -0
  66. package/dist/chunk-EVAOPEO4.js.map +1 -0
  67. package/dist/chunk-EYRBENHC.js +3 -0
  68. package/dist/chunk-EYRBENHC.js.map +1 -0
  69. package/dist/chunk-FDE5HWDI.cjs +2 -0
  70. package/dist/chunk-FDE5HWDI.cjs.map +1 -0
  71. package/dist/chunk-FWW3M36J.cjs +2 -0
  72. package/dist/chunk-FWW3M36J.cjs.map +1 -0
  73. package/dist/chunk-GOIQYUWV.js +2 -0
  74. package/dist/chunk-GOIQYUWV.js.map +1 -0
  75. package/dist/chunk-HFKDWQUL.js +2 -0
  76. package/dist/chunk-HFKDWQUL.js.map +1 -0
  77. package/dist/chunk-HLBYHXQD.cjs +3 -0
  78. package/dist/chunk-HLBYHXQD.cjs.map +1 -0
  79. package/dist/chunk-IANAMBJQ.cjs +2 -0
  80. package/dist/chunk-IANAMBJQ.cjs.map +1 -0
  81. package/dist/chunk-IJMNVBIS.js +2 -0
  82. package/dist/chunk-IJMNVBIS.js.map +1 -0
  83. package/dist/chunk-J4LZD4ZY.js +3 -0
  84. package/dist/chunk-J4LZD4ZY.js.map +1 -0
  85. package/dist/chunk-JAK3RAFA.cjs +2 -0
  86. package/dist/chunk-JAK3RAFA.cjs.map +1 -0
  87. package/dist/chunk-JFAJN3C2.cjs +2 -0
  88. package/dist/chunk-JFAJN3C2.cjs.map +1 -0
  89. package/dist/chunk-JPFCXLJV.js +2 -0
  90. package/dist/chunk-JPFCXLJV.js.map +1 -0
  91. package/dist/chunk-JSPKKNPQ.js +3 -0
  92. package/dist/chunk-JSPKKNPQ.js.map +1 -0
  93. package/dist/chunk-L3FPQSGN.js +2 -0
  94. package/dist/chunk-L3FPQSGN.js.map +1 -0
  95. package/dist/chunk-LR4E4A4W.cjs +2 -0
  96. package/dist/chunk-LR4E4A4W.cjs.map +1 -0
  97. package/dist/chunk-MIQBJGGR.js +2 -0
  98. package/dist/chunk-MIQBJGGR.js.map +1 -0
  99. package/dist/chunk-MPB7KUN5.js +3 -0
  100. package/dist/chunk-MPB7KUN5.js.map +1 -0
  101. package/dist/chunk-MSYX32PF.cjs +2 -0
  102. package/dist/chunk-MSYX32PF.cjs.map +1 -0
  103. package/dist/chunk-MVZUTETT.js +2 -0
  104. package/dist/chunk-MVZUTETT.js.map +1 -0
  105. package/dist/chunk-N7N7MPMK.cjs +2 -0
  106. package/dist/chunk-N7N7MPMK.cjs.map +1 -0
  107. package/dist/chunk-NGBBNL4K.cjs +1 -3
  108. package/dist/chunk-P6WPEUAJ.cjs +2 -0
  109. package/dist/chunk-P6WPEUAJ.cjs.map +1 -0
  110. package/dist/chunk-PS272DZJ.cjs +2 -0
  111. package/dist/chunk-PS272DZJ.cjs.map +1 -0
  112. package/dist/chunk-QXQE7X4S.js +2 -0
  113. package/dist/chunk-QXQE7X4S.js.map +1 -0
  114. package/dist/chunk-R2ENWQ76.js +2 -0
  115. package/dist/chunk-R2ENWQ76.js.map +1 -0
  116. package/dist/chunk-R2SZFJTT.cjs +2 -0
  117. package/dist/chunk-R2SZFJTT.cjs.map +1 -0
  118. package/dist/chunk-RAF57WYO.js +2 -0
  119. package/dist/chunk-RAF57WYO.js.map +1 -0
  120. package/dist/chunk-RSF25YSJ.js +2 -0
  121. package/dist/chunk-RSF25YSJ.js.map +1 -0
  122. package/dist/chunk-SOMGSIO4.cjs +3 -0
  123. package/dist/chunk-SOMGSIO4.cjs.map +1 -0
  124. package/dist/chunk-SUXRZWH2.cjs +3 -0
  125. package/dist/chunk-SUXRZWH2.cjs.map +1 -0
  126. package/dist/chunk-SYYE3QAX.cjs +2 -0
  127. package/dist/chunk-SYYE3QAX.cjs.map +1 -0
  128. package/dist/chunk-SZGK6RIP.cjs +2 -0
  129. package/dist/chunk-SZGK6RIP.cjs.map +1 -0
  130. package/dist/chunk-TCZSPH4A.js +2 -0
  131. package/dist/chunk-TCZSPH4A.js.map +1 -0
  132. package/dist/chunk-TLG7VZRX.cjs +2 -0
  133. package/dist/chunk-TLG7VZRX.cjs.map +1 -0
  134. package/dist/chunk-TRBXW6HW.js +2 -0
  135. package/dist/{chunk-AQNHHJMJ.cjs.map → chunk-TRBXW6HW.js.map} +1 -1
  136. package/dist/chunk-TTFO4YDP.cjs +2 -0
  137. package/dist/chunk-TTFO4YDP.cjs.map +1 -0
  138. package/dist/chunk-TWC7K3ZX.js +2 -0
  139. package/dist/chunk-TWC7K3ZX.js.map +1 -0
  140. package/dist/chunk-UDQ57ZRX.cjs +2 -0
  141. package/dist/chunk-UDQ57ZRX.cjs.map +1 -0
  142. package/dist/chunk-UI6IFGBT.js +2 -0
  143. package/dist/chunk-UI6IFGBT.js.map +1 -0
  144. package/dist/chunk-UURM7P3P.cjs +4 -0
  145. package/dist/chunk-UURM7P3P.cjs.map +1 -0
  146. package/dist/chunk-W2JAR233.js +2 -0
  147. package/dist/chunk-W2JAR233.js.map +1 -0
  148. package/dist/chunk-WGZ3FNHI.js +2 -0
  149. package/dist/chunk-WGZ3FNHI.js.map +1 -0
  150. package/dist/chunk-WN5CMP4T.cjs +3 -0
  151. package/dist/chunk-WN5CMP4T.cjs.map +1 -0
  152. package/dist/chunk-XEIDV5JP.js +2 -0
  153. package/dist/chunk-XEIDV5JP.js.map +1 -0
  154. package/dist/chunk-XNIWQHXY.js +2 -0
  155. package/dist/chunk-XNIWQHXY.js.map +1 -0
  156. package/dist/chunk-XR7HEC7B.js +5 -0
  157. package/dist/chunk-XR7HEC7B.js.map +1 -0
  158. package/dist/chunk-Y7O4D3BJ.cjs +2 -0
  159. package/dist/chunk-Y7O4D3BJ.cjs.map +1 -0
  160. package/dist/chunk-YAYBVVG2.js +3 -0
  161. package/dist/chunk-YAYBVVG2.js.map +1 -0
  162. package/dist/chunk-YJ2OPULK.js +2 -0
  163. package/dist/chunk-YJ2OPULK.js.map +1 -0
  164. package/dist/chunk-YVKHEAFT.js +2 -0
  165. package/dist/chunk-YVKHEAFT.js.map +1 -0
  166. package/dist/chunk-ZCNBT44X.cjs +2 -0
  167. package/dist/chunk-ZCNBT44X.cjs.map +1 -0
  168. package/dist/chunk-ZLRJ7TDP.cjs +2 -0
  169. package/dist/chunk-ZLRJ7TDP.cjs.map +1 -0
  170. package/dist/constants.cjs +1 -21
  171. package/dist/constants.d.cts +1 -1
  172. package/dist/constants.d.ts +1 -1
  173. package/dist/constants.js +1 -4
  174. package/dist/engine.cjs +1 -94
  175. package/dist/engine.d.cts +29 -14
  176. package/dist/engine.d.ts +29 -14
  177. package/dist/engine.js +1 -37
  178. package/dist/errors.cjs +1 -105
  179. package/dist/errors.d.cts +3 -3
  180. package/dist/errors.d.ts +3 -3
  181. package/dist/errors.js +1 -4
  182. package/dist/format.cjs +1 -26
  183. package/dist/format.d.cts +2 -2
  184. package/dist/format.d.ts +2 -2
  185. package/dist/format.js +1 -9
  186. package/dist/index.cjs +1 -314
  187. package/dist/index.cjs.map +1 -1
  188. package/dist/index.d.cts +55 -23
  189. package/dist/index.d.ts +55 -23
  190. package/dist/index.js +1 -278
  191. package/dist/index.js.map +1 -1
  192. package/dist/language.cjs +1 -369
  193. package/dist/language.cjs.map +1 -1
  194. package/dist/language.d.cts +12 -13
  195. package/dist/language.d.ts +12 -13
  196. package/dist/language.js +1 -348
  197. package/dist/language.js.map +1 -1
  198. package/dist/lexer.cjs +1 -63
  199. package/dist/lexer.d.cts +3 -3
  200. package/dist/lexer.d.ts +3 -3
  201. package/dist/lexer.js +1 -10
  202. package/dist/normalizer.cjs +1 -39
  203. package/dist/normalizer.d.cts +3 -3
  204. package/dist/normalizer.d.ts +3 -3
  205. package/dist/normalizer.js +1 -10
  206. package/dist/packages.cjs +1 -128
  207. package/dist/packages.d.cts +39 -14
  208. package/dist/packages.d.ts +39 -14
  209. package/dist/packages.js +1 -23
  210. package/dist/parser.cjs +1 -54
  211. package/dist/parser.d.cts +9 -9
  212. package/dist/parser.d.ts +9 -9
  213. package/dist/parser.js +1 -9
  214. package/dist/{pipeline-CtfJtPQc.d.cts → pipeline-72QmQlGx.d.ts} +3 -3
  215. package/dist/{pipeline-DCd5M6Gk.d.ts → pipeline-DCQicwWX.d.cts} +3 -3
  216. package/dist/resolvers.cjs +1 -12
  217. package/dist/resolvers.d.cts +3 -3
  218. package/dist/resolvers.d.ts +3 -3
  219. package/dist/resolvers.js +1 -3
  220. package/dist/services.cjs +1 -20
  221. package/dist/services.js +1 -3
  222. package/dist/testing.cjs +3 -477
  223. package/dist/testing.cjs.map +1 -1
  224. package/dist/testing.d.cts +12 -13
  225. package/dist/testing.d.ts +12 -13
  226. package/dist/testing.js +3 -469
  227. package/dist/testing.js.map +1 -1
  228. package/dist/uom.cjs +1 -55
  229. package/dist/uom.d.cts +3 -3
  230. package/dist/uom.d.ts +3 -3
  231. package/dist/uom.js +1 -10
  232. package/dist/utilities.cjs +1 -36
  233. package/dist/utilities.js +1 -7
  234. package/dist/vm.cjs +1 -295
  235. package/dist/vm.cjs.map +1 -1
  236. package/dist/vm.d.cts +22 -10
  237. package/dist/vm.d.ts +22 -10
  238. package/dist/vm.js +1 -193
  239. package/dist/vm.js.map +1 -1
  240. package/dist/worker.cjs +2 -492
  241. package/dist/worker.cjs.map +1 -1
  242. package/dist/worker.d.cts +19 -20
  243. package/dist/worker.d.ts +19 -20
  244. package/dist/worker.js +2 -483
  245. package/dist/worker.js.map +1 -1
  246. package/package.json +1 -13
  247. package/dist/chunk-267JPOTF.js +0 -406
  248. package/dist/chunk-267JPOTF.js.map +0 -1
  249. package/dist/chunk-2TZKENDH.cjs +0 -448
  250. package/dist/chunk-2TZKENDH.cjs.map +0 -1
  251. package/dist/chunk-3BOK2LDK.js +0 -17
  252. package/dist/chunk-3BOK2LDK.js.map +0 -1
  253. package/dist/chunk-3OWCDIPN.js +0 -215
  254. package/dist/chunk-3OWCDIPN.js.map +0 -1
  255. package/dist/chunk-3VGDNEE3.js +0 -84
  256. package/dist/chunk-3VGDNEE3.js.map +0 -1
  257. package/dist/chunk-4D6NIHE2.js +0 -451
  258. package/dist/chunk-4D6NIHE2.js.map +0 -1
  259. package/dist/chunk-4HQKTMWG.js +0 -7985
  260. package/dist/chunk-4HQKTMWG.js.map +0 -1
  261. package/dist/chunk-536WPM2V.cjs +0 -283
  262. package/dist/chunk-536WPM2V.cjs.map +0 -1
  263. package/dist/chunk-5HRB36DK.js +0 -405
  264. package/dist/chunk-5HRB36DK.js.map +0 -1
  265. package/dist/chunk-5ON7PUAZ.js +0 -12
  266. package/dist/chunk-5ON7PUAZ.js.map +0 -1
  267. package/dist/chunk-7KYSUDQO.js +0 -109
  268. package/dist/chunk-7KYSUDQO.js.map +0 -1
  269. package/dist/chunk-7ZX6B7SY.cjs +0 -3222
  270. package/dist/chunk-7ZX6B7SY.cjs.map +0 -1
  271. package/dist/chunk-ADBA3XBE.cjs +0 -20
  272. package/dist/chunk-ADBA3XBE.cjs.map +0 -1
  273. package/dist/chunk-ALYRJ72W.cjs +0 -434
  274. package/dist/chunk-ALYRJ72W.cjs.map +0 -1
  275. package/dist/chunk-AMOJYLG2.cjs +0 -1692
  276. package/dist/chunk-AMOJYLG2.cjs.map +0 -1
  277. package/dist/chunk-AQNHHJMJ.cjs +0 -261
  278. package/dist/chunk-B4HBEFTB.cjs +0 -375
  279. package/dist/chunk-B4HBEFTB.cjs.map +0 -1
  280. package/dist/chunk-B7LXJ6LC.cjs +0 -36
  281. package/dist/chunk-B7LXJ6LC.cjs.map +0 -1
  282. package/dist/chunk-B7NLZMQ3.cjs +0 -74
  283. package/dist/chunk-B7NLZMQ3.cjs.map +0 -1
  284. package/dist/chunk-BLI4NIQY.js +0 -98
  285. package/dist/chunk-BLI4NIQY.js.map +0 -1
  286. package/dist/chunk-BYJBUL7U.js +0 -499
  287. package/dist/chunk-BYJBUL7U.js.map +0 -1
  288. package/dist/chunk-CCBZZQAE.js +0 -312
  289. package/dist/chunk-CCBZZQAE.js.map +0 -1
  290. package/dist/chunk-CKQMXMHR.cjs +0 -219
  291. package/dist/chunk-CKQMXMHR.cjs.map +0 -1
  292. package/dist/chunk-CUR2WLI4.cjs +0 -507
  293. package/dist/chunk-CUR2WLI4.cjs.map +0 -1
  294. package/dist/chunk-DLEBSLF4.js +0 -336
  295. package/dist/chunk-DLEBSLF4.js.map +0 -1
  296. package/dist/chunk-E23GZEWL.cjs +0 -209
  297. package/dist/chunk-E23GZEWL.cjs.map +0 -1
  298. package/dist/chunk-EJ3ILXX6.cjs +0 -223
  299. package/dist/chunk-EJ3ILXX6.cjs.map +0 -1
  300. package/dist/chunk-ENKKJYD3.js +0 -333
  301. package/dist/chunk-ENKKJYD3.js.map +0 -1
  302. package/dist/chunk-ENRIK36Q.cjs +0 -94
  303. package/dist/chunk-ENRIK36Q.cjs.map +0 -1
  304. package/dist/chunk-ERCOHGXD.js +0 -356
  305. package/dist/chunk-ERCOHGXD.js.map +0 -1
  306. package/dist/chunk-FD5ZZHEU.js +0 -92
  307. package/dist/chunk-FD5ZZHEU.js.map +0 -1
  308. package/dist/chunk-FEAIOR7N.cjs +0 -91
  309. package/dist/chunk-FEAIOR7N.cjs.map +0 -1
  310. package/dist/chunk-GCM5JHMX.js +0 -88
  311. package/dist/chunk-GCM5JHMX.js.map +0 -1
  312. package/dist/chunk-GLA4JXBO.js +0 -204
  313. package/dist/chunk-GLA4JXBO.js.map +0 -1
  314. package/dist/chunk-HIQ5HSZL.cjs +0 -1923
  315. package/dist/chunk-HIQ5HSZL.cjs.map +0 -1
  316. package/dist/chunk-HVRVSI2Z.cjs +0 -829
  317. package/dist/chunk-HVRVSI2Z.cjs.map +0 -1
  318. package/dist/chunk-I4GAWIPW.js +0 -825
  319. package/dist/chunk-I4GAWIPW.js.map +0 -1
  320. package/dist/chunk-J45BCEZ4.cjs +0 -339
  321. package/dist/chunk-J45BCEZ4.cjs.map +0 -1
  322. package/dist/chunk-JG6ZJ2WU.js +0 -1513
  323. package/dist/chunk-JG6ZJ2WU.js.map +0 -1
  324. package/dist/chunk-L2TE7PMO.cjs +0 -14
  325. package/dist/chunk-L2TE7PMO.cjs.map +0 -1
  326. package/dist/chunk-LHZ6VOA7.js +0 -1764
  327. package/dist/chunk-LHZ6VOA7.js.map +0 -1
  328. package/dist/chunk-MN3LHRGV.cjs +0 -8012
  329. package/dist/chunk-MN3LHRGV.cjs.map +0 -1
  330. package/dist/chunk-MVTOCRV2.js +0 -213
  331. package/dist/chunk-MVTOCRV2.js.map +0 -1
  332. package/dist/chunk-N5NNW4VG.cjs +0 -341
  333. package/dist/chunk-N5NNW4VG.cjs.map +0 -1
  334. package/dist/chunk-N7FNVFXW.cjs +0 -32
  335. package/dist/chunk-N7FNVFXW.cjs.map +0 -1
  336. package/dist/chunk-NKW7LKYU.js +0 -3185
  337. package/dist/chunk-NKW7LKYU.js.map +0 -1
  338. package/dist/chunk-NLNDMWZC.js +0 -31
  339. package/dist/chunk-NLNDMWZC.js.map +0 -1
  340. package/dist/chunk-NNQ2TYDF.js +0 -1848
  341. package/dist/chunk-NNQ2TYDF.js.map +0 -1
  342. package/dist/chunk-NNZAEUDW.js +0 -6792
  343. package/dist/chunk-NNZAEUDW.js.map +0 -1
  344. package/dist/chunk-OUHT5Z36.cjs +0 -393
  345. package/dist/chunk-OUHT5Z36.cjs.map +0 -1
  346. package/dist/chunk-QFTDTX6K.cjs +0 -457
  347. package/dist/chunk-QFTDTX6K.cjs.map +0 -1
  348. package/dist/chunk-SBUFNJVE.js +0 -258
  349. package/dist/chunk-SBUFNJVE.js.map +0 -1
  350. package/dist/chunk-SRGQ72IR.cjs +0 -2800
  351. package/dist/chunk-SRGQ72IR.cjs.map +0 -1
  352. package/dist/chunk-SSV46KFA.cjs +0 -112
  353. package/dist/chunk-SSV46KFA.cjs.map +0 -1
  354. package/dist/chunk-T6ZYQJ63.cjs +0 -6807
  355. package/dist/chunk-T6ZYQJ63.cjs.map +0 -1
  356. package/dist/chunk-UKQHXPGW.js +0 -30
  357. package/dist/chunk-UKQHXPGW.js.map +0 -1
  358. package/dist/chunk-UO6BUV6K.js +0 -278
  359. package/dist/chunk-UO6BUV6K.js.map +0 -1
  360. package/dist/chunk-V4XG5QF6.js +0 -1685
  361. package/dist/chunk-V4XG5QF6.js.map +0 -1
  362. package/dist/chunk-VEKIWQ3F.cjs +0 -39
  363. package/dist/chunk-VEKIWQ3F.cjs.map +0 -1
  364. package/dist/chunk-WWQEY7BV.js +0 -67
  365. package/dist/chunk-WWQEY7BV.js.map +0 -1
  366. package/dist/chunk-WXEHD6TT.js +0 -2795
  367. package/dist/chunk-WXEHD6TT.js.map +0 -1
  368. package/dist/chunk-X6K3HUOY.cjs +0 -86
  369. package/dist/chunk-X6K3HUOY.cjs.map +0 -1
  370. package/dist/chunk-XA4CKRML.cjs +0 -316
  371. package/dist/chunk-XA4CKRML.cjs.map +0 -1
  372. package/dist/chunk-XBTEO4OB.js +0 -391
  373. package/dist/chunk-XBTEO4OB.js.map +0 -1
  374. package/dist/chunk-XIYYHA65.cjs +0 -101
  375. package/dist/chunk-XIYYHA65.cjs.map +0 -1
  376. package/dist/chunk-YLJ4XMA6.js +0 -33
  377. package/dist/chunk-YLJ4XMA6.js.map +0 -1
  378. package/dist/chunk-YRIKITGF.cjs +0 -1768
  379. package/dist/chunk-YRIKITGF.cjs.map +0 -1
  380. package/dist/chunk-Z2XP767T.cjs +0 -35
  381. package/dist/chunk-Z2XP767T.cjs.map +0 -1
  382. package/dist/chunk-Z4X2RWOF.js +0 -37
  383. package/dist/chunk-Z4X2RWOF.js.map +0 -1
  384. package/dist/chunk-Z7XGGLI2.js +0 -455
  385. package/dist/chunk-Z7XGGLI2.js.map +0 -1
  386. package/dist/chunk-ZMW6NU2K.cjs +0 -1516
  387. package/dist/chunk-ZMW6NU2K.cjs.map +0 -1
  388. package/dist/chunk-ZVTWQLK4.cjs +0 -459
  389. package/dist/chunk-ZVTWQLK4.cjs.map +0 -1
  390. package/dist/variables.cjs +0 -17
  391. package/dist/variables.cjs.map +0 -1
  392. package/dist/variables.d.cts +0 -87
  393. package/dist/variables.d.ts +0 -87
  394. package/dist/variables.js +0 -4
  395. package/dist/variables.js.map +0 -1
@@ -1,2800 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkXA4CKRML_cjs = require('./chunk-XA4CKRML.cjs');
4
- var chunk7ZX6B7SY_cjs = require('./chunk-7ZX6B7SY.cjs');
5
- var chunkZVTWQLK4_cjs = require('./chunk-ZVTWQLK4.cjs');
6
- var chunkXIYYHA65_cjs = require('./chunk-XIYYHA65.cjs');
7
- var chunkHIQ5HSZL_cjs = require('./chunk-HIQ5HSZL.cjs');
8
- var chunk2TZKENDH_cjs = require('./chunk-2TZKENDH.cjs');
9
- var chunkEJ3ILXX6_cjs = require('./chunk-EJ3ILXX6.cjs');
10
- var chunkAMOJYLG2_cjs = require('./chunk-AMOJYLG2.cjs');
11
- var chunkB4HBEFTB_cjs = require('./chunk-B4HBEFTB.cjs');
12
-
13
- // src/vm/DependencyGraph.ts
14
- var DependencyGraph = class {
15
- constructor() {
16
- this.consumers = /* @__PURE__ */ new Map();
17
- this.dependencies = /* @__PURE__ */ new Map();
18
- this.writes = /* @__PURE__ */ new Map();
19
- this.lineReads = /* @__PURE__ */ new Map();
20
- // Data source dependencies: line number -> Set of query keys
21
- this.dataSourceDependencies = /* @__PURE__ */ new Map();
22
- // Reverse map: query key -> Set of line numbers
23
- this.dataSourceConsumers = /* @__PURE__ */ new Map();
24
- }
25
- /**
26
- * Register a line's variable reads and writes in the dependency graph.
27
- *
28
- * If re-registering the same line (e.g., after editing), old consumer
29
- * references are cleaned up first. Write-variables are removed from
30
- * the consumer set so that redefinition breaks the old dependency chain.
31
- *
32
- * @param lineNumber - 1-based line number in the document
33
- * @param reads - Variable names this line reads
34
- * @param writes - Variable names this line writes (assigns to)
35
- */
36
- registerLine(lineNumber, reads, writes) {
37
- const oldReads = this.lineReads.get(lineNumber);
38
- if (oldReads) {
39
- for (const oldRead of oldReads) {
40
- const consumers = this.consumers.get(oldRead);
41
- if (consumers) consumers.delete(lineNumber);
42
- }
43
- }
44
- this.lineReads.set(lineNumber, new Set(reads));
45
- for (const dep of reads) {
46
- if (!this.consumers.has(dep)) this.consumers.set(dep, /* @__PURE__ */ new Set());
47
- this.consumers.get(dep).add(lineNumber);
48
- }
49
- if (writes.length > 0) {
50
- this.dependencies.set(lineNumber, new Set(reads));
51
- this.writes.set(lineNumber, new Set(writes));
52
- for (const write of writes) {
53
- const prevConsumer = this.consumers.get(write);
54
- if (prevConsumer) prevConsumer.delete(lineNumber);
55
- }
56
- }
57
- }
58
- /**
59
- * Register a line's dependency on an external data source (e.g., currency rate, OSRS GE price).
60
- *
61
- * When the data source updates, {@link getAffectedLinesByDataSource} returns all lines
62
- * that depend on this data, enabling targeted re-evaluation.
63
- *
64
- * @param lineNumber - 1-based line number in the document
65
- * @param dataSourceId - Unique identifier for the data source (e.g., "currency", "osrs-ge")
66
- * @param queryKey - Query key array identifying the specific data (e.g., ["USD", "EUR"])
67
- */
68
- registerLineDataSourceDependency(lineNumber, dataSourceId, queryKey) {
69
- const queryKeyStr = JSON.stringify(queryKey);
70
- const key = `${dataSourceId}:${queryKeyStr}`;
71
- if (!this.dataSourceDependencies.has(lineNumber)) {
72
- this.dataSourceDependencies.set(lineNumber, /* @__PURE__ */ new Set());
73
- }
74
- this.dataSourceDependencies.get(lineNumber).add(key);
75
- if (!this.dataSourceConsumers.has(key)) {
76
- this.dataSourceConsumers.set(key, /* @__PURE__ */ new Set());
77
- }
78
- this.dataSourceConsumers.get(key).add(lineNumber);
79
- }
80
- /**
81
- * Find all lines affected by a changed variable via BFS through the consumer graph.
82
- *
83
- * When a variable is modified (e.g., `:x = 5` changes to `:x = 10`), this returns
84
- * all lines that transitively depend on it, lines that read `x`, lines that read
85
- * variables written by those lines, and so on.
86
- *
87
- * @param changedVariable - The variable name that changed
88
- * @returns Set of line numbers that need re-evaluation
89
- */
90
- getAffectedLines(changedVariable) {
91
- const visited = /* @__PURE__ */ new Set();
92
- const queue = [changedVariable];
93
- while (queue.length > 0) {
94
- const varName = queue.pop();
95
- const consumers = this.consumers.get(varName);
96
- if (!consumers) continue;
97
- for (const line of consumers) {
98
- if (visited.has(line)) continue;
99
- visited.add(line);
100
- const lineWrites = this.writes.get(line);
101
- if (lineWrites) {
102
- for (const writtenVar of lineWrites) {
103
- queue.push(writtenVar);
104
- }
105
- }
106
- }
107
- }
108
- return visited;
109
- }
110
- /**
111
- * Phase 1.4 DAG-walk optimization: return affected lines in dependency-safe
112
- * topological order. Uses Kahn's algorithm (BFS-based) to ensure every line
113
- * is evaluated AFTER all lines it depends on have been processed.
114
- *
115
- * This is more correct than ascending line-number sort, which fails when
116
- * variable definitions and their consumers are not in document order.
117
- *
118
- * @returns Line numbers in topological order (producers before consumers).
119
- */
120
- getAffectedLinesInOrder(startVariable) {
121
- const affected = this.getAffectedLines(startVariable);
122
- if (affected.size === 0) return [];
123
- const inDegree = /* @__PURE__ */ new Map();
124
- const adjacency = /* @__PURE__ */ new Map();
125
- for (const line of affected) {
126
- if (!inDegree.has(line)) inDegree.set(line, 0);
127
- if (!adjacency.has(line)) adjacency.set(line, []);
128
- }
129
- const producerOf = /* @__PURE__ */ new Map();
130
- for (const line of affected) {
131
- const lineWrites = this.writes.get(line);
132
- if (lineWrites) {
133
- for (const w of lineWrites) producerOf.set(w, line);
134
- }
135
- }
136
- for (const line of affected) {
137
- const reads = this.lineReads.get(line);
138
- if (!reads) continue;
139
- for (const readVar of reads) {
140
- const producer = producerOf.get(readVar);
141
- if (producer !== void 0 && producer !== line) {
142
- adjacency.get(producer).push(line);
143
- inDegree.set(line, (inDegree.get(line) ?? 0) + 1);
144
- }
145
- }
146
- }
147
- const queue = [];
148
- for (const [line, degree] of inDegree) {
149
- if (degree === 0) queue.push(line);
150
- }
151
- if (queue.length === 0 && affected.size > 0) {
152
- const sorted = Array.from(affected).sort((a, b) => a - b);
153
- queue.push(sorted[0]);
154
- }
155
- const ordered = [];
156
- while (queue.length > 0) {
157
- const current = queue.shift();
158
- ordered.push(current);
159
- for (const downstream of adjacency.get(current) ?? []) {
160
- const newDegree = (inDegree.get(downstream) ?? 1) - 1;
161
- inDegree.set(downstream, newDegree);
162
- if (newDegree === 0) queue.push(downstream);
163
- }
164
- }
165
- if (ordered.length < affected.size) {
166
- const orderedSet = new Set(ordered);
167
- const remaining = Array.from(affected).filter((l) => !orderedSet.has(l)).sort((a, b) => a - b);
168
- ordered.push(...remaining);
169
- }
170
- return ordered;
171
- }
172
- /**
173
- * Find all lines affected by a data source update.
174
- *
175
- * When an async data source resolves (e.g., currency rate fetch completes),
176
- * this returns all lines that depend on that specific data query.
177
- *
178
- * @param dataSourceId - The data source identifier
179
- * @param queryKey - The query key that was updated
180
- * @returns Set of line numbers that need re-evaluation
181
- */
182
- getAffectedLinesByDataSource(dataSourceId, queryKey) {
183
- const queryKeyStr = JSON.stringify(queryKey);
184
- const key = `${dataSourceId}:${queryKeyStr}`;
185
- return this.dataSourceConsumers.get(key) ?? /* @__PURE__ */ new Set();
186
- }
187
- /**
188
- * Remove a line from the dependency graph (e.g., when a line is deleted from the document).
189
- *
190
- * Cleans up all consumer references, write registrations, and data source dependencies
191
- * for the removed line. O(k) where k is the number of variables the line reads.
192
- *
193
- * @param lineNumber - The line number being removed
194
- */
195
- removeLine(lineNumber) {
196
- const reads = this.lineReads.get(lineNumber);
197
- if (reads) {
198
- for (const readVar of reads) {
199
- const consumers = this.consumers.get(readVar);
200
- if (consumers) consumers.delete(lineNumber);
201
- }
202
- this.lineReads.delete(lineNumber);
203
- }
204
- this.dependencies.delete(lineNumber);
205
- this.writes.delete(lineNumber);
206
- const dataSourceKeys = this.dataSourceDependencies.get(lineNumber);
207
- if (dataSourceKeys) {
208
- for (const key of dataSourceKeys) {
209
- this.dataSourceConsumers.get(key)?.delete(lineNumber);
210
- }
211
- this.dataSourceDependencies.delete(lineNumber);
212
- }
213
- }
214
- /**
215
- * Get all line numbers that consume (read) a given variable.
216
- *
217
- * @param variable - The variable name
218
- * @returns Set of line numbers that read this variable, or empty set if none
219
- */
220
- getConsumers(variable) {
221
- return this.consumers.get(variable) ?? /* @__PURE__ */ new Set();
222
- }
223
- /**
224
- * Get all variables that a line depends on (reads).
225
- *
226
- * @param lineNumber - The line number to query
227
- * @returns Set of variable names this line reads, or empty set if none
228
- */
229
- getDependencies(lineNumber) {
230
- return this.dependencies.get(lineNumber) ?? /* @__PURE__ */ new Set();
231
- }
232
- /**
233
- * Get all variables that a line writes (assigns to).
234
- *
235
- * @param lineNumber - The line number to query
236
- * @returns Set of variable names this line writes, or empty set if none
237
- */
238
- getWrites(lineNumber) {
239
- return this.writes.get(lineNumber) ?? /* @__PURE__ */ new Set();
240
- }
241
- /**
242
- * Get a serializable snapshot of the entire dependency graph for diagnostics.
243
- *
244
- * Returns plain objects (not Maps/Sets) so consumers don't need to reach
245
- * into private fields. Used by playground diagnostic tabs for DAG visualization.
246
- */
247
- getSnapshot() {
248
- const consumers = {};
249
- for (const [variable, lines] of this.consumers) {
250
- consumers[variable] = Array.from(lines);
251
- }
252
- const writes = {};
253
- for (const [line, vars] of this.writes) {
254
- writes[line] = Array.from(vars);
255
- }
256
- const reads = {};
257
- for (const [line, vars] of this.lineReads) {
258
- reads[line] = Array.from(vars);
259
- }
260
- const dataSourceDeps = {};
261
- for (const [line, keys] of this.dataSourceDependencies) {
262
- dataSourceDeps[line] = Array.from(keys);
263
- }
264
- const dataSourceConsumers = {};
265
- for (const [key, lines] of this.dataSourceConsumers) {
266
- dataSourceConsumers[key] = Array.from(lines);
267
- }
268
- return { consumers, writes, reads, dataSourceDeps, dataSourceConsumers };
269
- }
270
- /** Clear all dependency graph state. Called on document switch or engine reset. */
271
- clear() {
272
- this.consumers.clear();
273
- this.dependencies.clear();
274
- this.writes.clear();
275
- this.lineReads.clear();
276
- this.dataSourceDependencies.clear();
277
- this.dataSourceConsumers.clear();
278
- }
279
- };
280
-
281
- // src/vm/ScopeManager.ts
282
- var ScopeManager = class {
283
- constructor() {
284
- this.definitions = /* @__PURE__ */ new Map();
285
- }
286
- /**
287
- * Record a variable definition at `lineNumber`. A variable may have
288
- * multiple definitions across different lines (e.g. redefined further
289
- * down a document), each call adds one, keeping the internal stack
290
- * sorted by line so {@link read} can binary-scan for "most recent
291
- * definition at or before" a given line.
292
- */
293
- write(variable, lineNumber, expr) {
294
- if (!this.definitions.has(variable)) {
295
- this.definitions.set(variable, []);
296
- }
297
- const stack = this.definitions.get(variable);
298
- stack.push({ line: lineNumber, expr });
299
- stack.sort((a, b) => a.line - b.line);
300
- }
301
- /**
302
- * Look up a variable's value as seen from `readLine`: returns the result
303
- * of the closest definition at or before `readLine`, not simply the most
304
- * recently-written one, so a read on line 5 of a variable redefined on
305
- * lines 2 and 10 sees line 2's value, not line 10's. Returns `undefined`
306
- * if the variable has no definition at or before `readLine`.
307
- */
308
- read(variable, readLine) {
309
- const stack = this.definitions.get(variable);
310
- if (!stack) return void 0;
311
- for (let i = stack.length - 1; i >= 0; i--) {
312
- if (stack[i].line <= readLine) return stack[i].expr.lastResult;
313
- }
314
- return void 0;
315
- }
316
- /**
317
- * Drop every definition of `variable` that comes strictly after
318
- * `definitionLine`. Call this when a line is re-evaluated with a new
319
- * definition, so stale later-line definitions from a previous edit don't
320
- * linger and get returned by {@link read}.
321
- */
322
- invalidateDownstream(variable, definitionLine) {
323
- const stack = this.definitions.get(variable);
324
- if (!stack) return;
325
- const idx = stack.findIndex((s) => s.line === definitionLine);
326
- if (idx === -1) return;
327
- stack.splice(idx + 1);
328
- }
329
- /** Remove every tracked variable definition, used when an engine/document is reset. */
330
- clear() {
331
- this.definitions.clear();
332
- }
333
- };
334
-
335
- // src/vm/BusinessDays.ts
336
- var MS_PER_DAY = 864e5;
337
- function isWeekend(epochMs) {
338
- const day = new Date(epochMs).getDay();
339
- return day === 0 || day === 6;
340
- }
341
- function isBusinessDay(epochMs, isHoliday) {
342
- if (isWeekend(epochMs)) return false;
343
- return isHoliday ? !isHoliday(epochMs) : true;
344
- }
345
- function startOfLocalDay(epochMs) {
346
- const d = new Date(epochMs);
347
- return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();
348
- }
349
- function addBusinessDays(startMs, n, isHoliday, maxCalendarSteps) {
350
- let remaining = Math.trunc(Math.abs(n));
351
- const direction = n >= 0 ? 1 : -1;
352
- const date = new Date(startMs);
353
- let steps = 0;
354
- while (remaining > 0) {
355
- date.setDate(date.getDate() + direction);
356
- steps++;
357
- if (steps > maxCalendarSteps) return null;
358
- if (isBusinessDay(date.getTime(), isHoliday)) remaining--;
359
- }
360
- return date.getTime();
361
- }
362
- function countBusinessDaysBetween(aMs, bMs, isHoliday, maxCalendarSteps) {
363
- const startDay = startOfLocalDay(Math.min(aMs, bMs));
364
- const endDay = startOfLocalDay(Math.max(aMs, bMs));
365
- const spanDays = Math.round((endDay - startDay) / MS_PER_DAY);
366
- if (spanDays > maxCalendarSteps) return null;
367
- let count = 0;
368
- const date = new Date(startDay);
369
- for (let i = 0; i <= spanDays; i++) {
370
- if (isBusinessDay(date.getTime(), isHoliday)) count++;
371
- date.setDate(date.getDate() + 1);
372
- }
373
- return count;
374
- }
375
-
376
- // src/vm/VMBuiltinArity.ts
377
- var BUILTIN_ARITY = {
378
- 0: { name: "sqrt", min: 1, max: 1 },
379
- 1: { name: "abs", min: 1, max: 1 },
380
- 2: { name: "sin", min: 1, max: 1 },
381
- 3: { name: "cos", min: 1, max: 1 },
382
- 4: { name: "tan", min: 1, max: 1 },
383
- 5: { name: "log", min: 1, max: 1 },
384
- 6: { name: "ceil", min: 1, max: 1 },
385
- 7: { name: "floor", min: 1, max: 1 },
386
- 8: { name: "round", min: 1, max: 2 },
387
- // min/max compare as many operands as they are given.
388
- 9: { name: "min", min: 1, max: Infinity },
389
- 10: { name: "max", min: 1, max: Infinity },
390
- 11: { name: "asin", min: 1, max: 1 },
391
- 12: { name: "acos", min: 1, max: 1 },
392
- 13: { name: "atan", min: 1, max: 1 },
393
- 14: { name: "atan2", min: 2, max: 2 },
394
- 15: { name: "sinh", min: 1, max: 1 },
395
- 16: { name: "cosh", min: 1, max: 1 },
396
- 17: { name: "tanh", min: 1, max: 1 },
397
- 18: { name: "asinh", min: 1, max: 1 },
398
- 19: { name: "acosh", min: 1, max: 1 },
399
- 20: { name: "atanh", min: 1, max: 1 },
400
- 21: { name: "cbrt", min: 1, max: 1 },
401
- 22: { name: "clz32", min: 1, max: 1 },
402
- 23: { name: "expm1", min: 1, max: 1 },
403
- 24: { name: "exp", min: 1, max: 1 },
404
- 25: { name: "fround", min: 1, max: 1 },
405
- // hypot is the length of a vector with as many components as it is given.
406
- 26: { name: "hypot", min: 1, max: Infinity },
407
- 27: { name: "imul", min: 2, max: 2 },
408
- 28: { name: "log10", min: 1, max: 1 },
409
- 29: { name: "log1p", min: 1, max: 1 },
410
- 30: { name: "log2", min: 1, max: 1 },
411
- 31: { name: "pow", min: 2, max: 2 },
412
- 32: { name: "random", min: 0, max: 0 },
413
- 33: { name: "sign", min: 1, max: 1 },
414
- 34: { name: "trunc", min: 1, max: 1 },
415
- 35: { name: "degtorad", min: 1, max: 1 },
416
- 36: { name: "radtodeg", min: 1, max: 1 },
417
- 37: { name: "roll", min: 2, max: 2 },
418
- 38: { name: "gcd", min: 2, max: 2 },
419
- 39: { name: "lcm", min: 2, max: 2 },
420
- 40: { name: "permutation", min: 2, max: 2 },
421
- 41: { name: "combination", min: 2, max: 2 },
422
- // The aggregates back "average of X, Y, Z" and friends, so they take a
423
- // list. Their implementations already answer for an empty list rather
424
- // than indexing into it, and the phrase parselets can emit an empty one,
425
- // so the minimum stays 0 here instead of being tightened on the way past.
426
- 42: { name: "average", min: 0, max: Infinity },
427
- 43: { name: "median", min: 0, max: Infinity },
428
- 44: { name: "total", min: 0, max: Infinity },
429
- 45: { name: "count", min: 0, max: Infinity },
430
- 46: { name: "proportion", min: 3, max: 3 },
431
- 47: { name: "clamp", min: 3, max: 3 },
432
- 48: { name: "hex", min: 1, max: 1 },
433
- 49: { name: "bin", min: 1, max: 1 },
434
- 50: { name: "int", min: 1, max: 1 },
435
- 51: { name: "compoundInterest", min: 3, max: 3 },
436
- 52: { name: "interestEarned", min: 3, max: 3 },
437
- 53: { name: "compoundInterestRate", min: 3, max: 3 },
438
- 54: { name: "compoundInterestYears", min: 3, max: 3 },
439
- 55: { name: "loanRepayment", min: 4, max: 4 },
440
- 56: { name: "loanInterest", min: 4, max: 4 },
441
- 57: { name: "monthlyPayment", min: 3, max: 3 },
442
- 58: { name: "taxAdd", min: 2, max: 2 },
443
- 59: { name: "taxRemove", min: 2, max: 2 },
444
- 60: { name: "inflationAdjust", min: 3, max: 3 },
445
- 61: { name: "root", min: 2, max: 2 },
446
- 62: { name: "fact", min: 1, max: 1 },
447
- 63: { name: "transpose", min: 1, max: 1 },
448
- 64: { name: "det", min: 1, max: 1 },
449
- 65: { name: "inv", min: 1, max: 1 },
450
- 66: { name: "dot", min: 2, max: 2 },
451
- 67: { name: "expand", min: 1, max: 1 },
452
- 68: { name: "factor", min: 1, max: 1 },
453
- // solve pushes the two sides of the equation and then the unknown's name.
454
- 69: { name: "solve", min: 3, max: 3 },
455
- // der's order of differentiation is optional and defaults to 1.
456
- 70: { name: "der", min: 2, max: 3 },
457
- 71: { name: "integral", min: 2, max: 2 },
458
- 72: { name: "taylor", min: 4, max: 4 },
459
- // jacobian differentiates however many functions it is handed.
460
- 73: { name: "jacobian", min: 1, max: Infinity },
461
- 74: { name: "imaginary", min: 1, max: 1 },
462
- 75: { name: "conj", min: 1, max: 1 },
463
- 76: { name: "re", min: 1, max: 1 },
464
- 77: { name: "im", min: 1, max: 1 },
465
- 78: { name: "cancel", min: 1, max: 1 },
466
- 79: { name: "apart", min: 1, max: 1 },
467
- 80: { name: "compoundInterestEvery", min: 4, max: 4 },
468
- 81: { name: "compoundInterestEarnedEvery", min: 4, max: 4 },
469
- 82: { name: "presentValue", min: 3, max: 3 },
470
- 83: { name: "roi", min: 2, max: 2 },
471
- 84: { name: "annualisedReturn", min: 3, max: 3 },
472
- 85: { name: "taxIn", min: 2, max: 2 },
473
- 86: { name: "taxOn", min: 2, max: 2 },
474
- 87: { name: "sind", min: 1, max: 1 },
475
- 88: { name: "cosd", min: 1, max: 1 },
476
- 89: { name: "tand", min: 1, max: 1 },
477
- 90: { name: "asind", min: 1, max: 1 },
478
- 91: { name: "acosd", min: 1, max: 1 },
479
- 92: { name: "atand", min: 1, max: 1 },
480
- 93: { name: "daysCount", min: 1, max: 1 },
481
- 94: { name: "asTwoUnits", min: 3, max: 3 },
482
- 95: { name: "makeRate", min: 2, max: 2 },
483
- 96: { name: "atRate", min: 2, max: 2 },
484
- // Not reachable by name, only through `<value> to <n> dp`; see
485
- // converters/parselets/RoundingParselets.ts.
486
- 97: { name: "roundToPlaces", min: 2, max: 2 }
487
- };
488
- function plural(count) {
489
- return count === 1 ? "1 argument" : `${count} arguments`;
490
- }
491
- function expectation(arity) {
492
- if (arity.max === Infinity) return `at least ${plural(arity.min)}`;
493
- if (arity.min === arity.max) return plural(arity.min);
494
- return `${arity.min} to ${plural(arity.max)}`;
495
- }
496
- function builtinArityError(index, argCount) {
497
- const arity = BUILTIN_ARITY[index];
498
- if (arity === void 0) return void 0;
499
- if (argCount >= arity.min && argCount <= arity.max) return void 0;
500
- return chunkB4HBEFTB_cjs.ErrorFactory.execution(
501
- "BUILTIN_ARITY_MISMATCH",
502
- `${arity.name}() takes ${expectation(arity)}, but was given ${argCount === 0 ? "none" : plural(argCount)}`,
503
- { functionName: arity.name, expectedMin: arity.min, expectedMax: arity.max, actual: argCount }
504
- );
505
- }
506
-
507
- // src/vm/VM.ts
508
- function createVM(registry, maxStackDepth = 200, maxInstructions = 5e4, maxFunctionRecursionDepth = 50, maxCollectionSize = 1e5, maxAllocatedElements = 2e6, maxFunctionCalls = 1e4, maxDateOffsetYears = 100, minDateOffsetYears = -100, context = chunk7ZX6B7SY_cjs.defaultEngineContext, holidayPredicate) {
509
- const stack = [];
510
- const variables = /* @__PURE__ */ new Map();
511
- let instructionCount = 0;
512
- let activeSignal;
513
- let abortCurrent;
514
- const callFrames = [];
515
- const userFunctions = /* @__PURE__ */ new Map();
516
- const equations = /* @__PURE__ */ new Map();
517
- const scalarEquations = /* @__PURE__ */ new Map();
518
- return {
519
- push(v) {
520
- if (stack.length < maxStackDepth) {
521
- stack.push(v);
522
- }
523
- },
524
- getMaxStackDepth() {
525
- return maxStackDepth;
526
- },
527
- getMaxCollectionSize() {
528
- return maxCollectionSize;
529
- },
530
- getMaxAllocatedElements() {
531
- return maxAllocatedElements;
532
- },
533
- getMaxFunctionCalls() {
534
- return maxFunctionCalls;
535
- },
536
- getMaxDateOffsetYears() {
537
- return maxDateOffsetYears;
538
- },
539
- getMinDateOffsetYears() {
540
- return minDateOffsetYears;
541
- },
542
- // False whenever no calendar was configured, which is what makes
543
- // unconfigured working-day arithmetic weekends-only. See
544
- // vm/BusinessDays.ts, the only reader.
545
- isHoliday(epochMs) {
546
- return holidayPredicate ? holidayPredicate(epochMs) : false;
547
- },
548
- pop() {
549
- if (stack.length === 0) {
550
- return chunk2TZKENDH_cjs.numberValue(0);
551
- }
552
- return stack.pop();
553
- },
554
- /**
555
- * Popped through `safePop()` for the same reason as `popString()` below.
556
- * Only the underflow half applies here: `toNumber()` is a real method on
557
- * every Value, so there was no cast to make a non-number look like one,
558
- * and the `!` was the whole bug.
559
- */
560
- popNumber() {
561
- return safePop(stack).toNumber();
562
- },
563
- /**
564
- * Popped through the same two guards the dispatch loop below uses, and
565
- * for the same reason: a package's opcode handler can disagree with its
566
- * own bytecode exactly as this engine's compiler can disagree with
567
- * hand-assembled input.
568
- *
569
- * This was `stack.pop()!.value as string`, which had neither guard. The
570
- * `!` is compile-time only, so an empty stack reached `.value` and threw
571
- * a raw TypeError; so is the cast, so any Value the stack happened to be
572
- * holding was handed back as a "string" and threw in the handler's own
573
- * code some lines later. Nothing in this repo calls this method, which is
574
- * the only reason the fuzz corpus never found either.
575
- */
576
- popString() {
577
- return stringOperand(safePop(stack), "VM.popString()");
578
- },
579
- peek() {
580
- return stack[stack.length - 1];
581
- },
582
- getStack() {
583
- return stack;
584
- },
585
- registry,
586
- getVar(key) {
587
- if (callFrames.length > 0) {
588
- const frameValue = callFrames[callFrames.length - 1].get(key);
589
- if (frameValue !== void 0) return frameValue;
590
- }
591
- return variables.get(key);
592
- },
593
- setVar(key, val) {
594
- variables.set(key, val);
595
- },
596
- pushCallFrame(frame) {
597
- if (callFrames.length >= maxFunctionRecursionDepth) {
598
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution(
599
- "FUNCTION_RECURSION_LIMIT_EXCEEDED",
600
- `Function call nesting exceeded maximum depth of ${maxFunctionRecursionDepth} (possible infinite recursion, e.g. f(x) = f(x))`,
601
- { maxFunctionRecursionDepth }
602
- );
603
- }
604
- callFrames.push(frame);
605
- },
606
- popCallFrame() {
607
- callFrames.pop();
608
- },
609
- getCallFrame() {
610
- return callFrames.length > 0 ? callFrames[callFrames.length - 1] : void 0;
611
- },
612
- defineUserFunction(name, params, program) {
613
- userFunctions.set(name, { name, params, program });
614
- },
615
- getUserFunction(name) {
616
- return userFunctions.get(name);
617
- },
618
- hasUserFunction(name) {
619
- return userFunctions.has(name);
620
- },
621
- getVariableEntries() {
622
- return Array.from(variables.entries());
623
- },
624
- getUserFunctionDefs() {
625
- return Array.from(userFunctions.values());
626
- },
627
- defineEquation(variable, factorNames, rhsProgram) {
628
- equations.set(variable, { variable, factorNames, rhsProgram });
629
- },
630
- getEquation(variable) {
631
- return equations.get(variable);
632
- },
633
- hasEquation(variable) {
634
- return equations.has(variable);
635
- },
636
- defineScalarEquation(variable, lhsProgram, rhsProgram) {
637
- scalarEquations.set(variable, { variable, lhsProgram, rhsProgram });
638
- },
639
- getScalarEquation(variable) {
640
- return scalarEquations.get(variable);
641
- },
642
- hasScalarEquation(variable) {
643
- return scalarEquations.has(variable);
644
- },
645
- reset() {
646
- stack.length = 0;
647
- variables.clear();
648
- callFrames.length = 0;
649
- userFunctions.clear();
650
- equations.clear();
651
- scalarEquations.clear();
652
- instructionCount = 0;
653
- if (abortCurrent) {
654
- abortCurrent();
655
- abortCurrent = void 0;
656
- }
657
- activeSignal = void 0;
658
- },
659
- get activeSignal() {
660
- return activeSignal;
661
- },
662
- set activeSignal(s) {
663
- activeSignal = s;
664
- },
665
- get abortCurrent() {
666
- return abortCurrent;
667
- },
668
- set abortCurrent(f) {
669
- abortCurrent = f;
670
- },
671
- context,
672
- getMaxInstructions() {
673
- return maxInstructions;
674
- },
675
- getInstructionCount() {
676
- return instructionCount;
677
- },
678
- incrementInstructions(n) {
679
- instructionCount += n;
680
- if (instructionCount > maxInstructions) {
681
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution("INSTRUCTION_LIMIT_EXCEEDED", `Execution exceeded maximum of ${maxInstructions} instructions`);
682
- }
683
- }
684
- };
685
- }
686
- function matrixProductCells(l, r) {
687
- if (l.rows === 1 && l.cols === 1) return r.data.length;
688
- if (r.rows === 1 && r.cols === 1) return l.data.length;
689
- if (l.cols !== r.rows) return 0;
690
- return l.rows * r.cols;
691
- }
692
- function matrixPowerCells(m, exponent) {
693
- if (!Number.isInteger(exponent) || exponent < 0) return 0;
694
- const cells = m.rows * m.cols;
695
- return cells * (1 + (exponent < 2 ? 1 : 2 * Math.floor(Math.log2(exponent))));
696
- }
697
- function safePop(stack) {
698
- if (stack.length === 0) {
699
- throw chunkB4HBEFTB_cjs.ErrorFactory.internal({
700
- code: "STACK_UNDERFLOW",
701
- message: "Stack underflow: an opcode expected a value on the stack but it was empty",
702
- expected: "at least one value on the VM stack",
703
- found: "an empty stack",
704
- suggestion: "this indicates corrupted bytecode or a bug in a package's parselet (mismatched push/pop counts), not a user-input error"
705
- });
706
- }
707
- return stack.pop();
708
- }
709
- var MALFORMED_BYTECODE_SUGGESTION = "bytecode is caller input on this entry point: rebuild the program with the engine's compiler, or fix the hand-assembled stream";
710
- function siteName(site) {
711
- return typeof site === "number" ? chunkXIYYHA65_cjs.getOpCodeName(site) : site;
712
- }
713
- function malformedBytecode(code, site, problem, expected, found, context = {}) {
714
- const name = siteName(site);
715
- return chunkB4HBEFTB_cjs.ErrorFactory.validation({
716
- code,
717
- message: `Malformed bytecode: ${name} ${problem}`,
718
- expected,
719
- found,
720
- suggestion: MALFORMED_BYTECODE_SUGGESTION,
721
- // A named site reports under `site` rather than borrowing `opcodeName`,
722
- // so a host reading `opcode`/`opcodeName` never gets a method name
723
- // where it expects an opcode, and never has to tell a missing opcode
724
- // apart from opcode 0.
725
- context: typeof site === "number" ? { opcode: site, opcodeName: name, ...context } : { site: name, ...context }
726
- });
727
- }
728
- function operandByte(opcodes, at, op, role) {
729
- if (at >= opcodes.length) {
730
- throw malformedBytecode(
731
- "MALFORMED_BYTECODE_TRUNCATED",
732
- op,
733
- `is missing its ${role}: the program ends mid-instruction`,
734
- `an operand byte at offset ${at}`,
735
- `a program only ${opcodes.length} byte(s) long`,
736
- { offset: at, length: opcodes.length, role }
737
- );
738
- }
739
- return opcodes[at];
740
- }
741
- function poolIndex(opcodes, at, op, role, poolSize, poolName) {
742
- const index = operandByte(opcodes, at, op, role);
743
- if (index >= poolSize) {
744
- throw malformedBytecode(
745
- "MALFORMED_BYTECODE_CONSTANT_INDEX",
746
- op,
747
- `reads ${poolName} entry ${index}, which does not exist`,
748
- `an index below ${poolSize}`,
749
- `${index}`,
750
- { index, poolSize, pool: poolName }
751
- );
752
- }
753
- return index;
754
- }
755
- function poolString(opcodes, at, strings, op, role) {
756
- return pooledString(strings, operandByte(opcodes, at, op, role), op);
757
- }
758
- function pooledString(strings, index, op) {
759
- const text = strings[index];
760
- if (typeof text !== "string") {
761
- throw malformedBytecode(
762
- "MALFORMED_BYTECODE_CONSTANT_INDEX",
763
- op,
764
- `reads string-pool entry ${index}, which is ${index >= strings.length ? "past the end of the pool" : "not a string"}`,
765
- `an index below ${strings.length}, holding a string`,
766
- index >= strings.length ? `${index}` : typeof text,
767
- { index, poolSize: strings.length, pool: "string-pool" }
768
- );
769
- }
770
- return text;
771
- }
772
- function stringOperand(value, site, role) {
773
- if (typeof value.value !== "string") {
774
- throw malformedBytecode(
775
- "MALFORMED_BYTECODE_OPERAND_TYPE",
776
- site,
777
- `expected a ${role ?? "string"} on the stack`,
778
- role ? `a string value holding the ${role}` : "a string value",
779
- `a ${chunk2TZKENDH_cjs.ValueType[value.type] ?? "unknown"} value`,
780
- role ? { role, valueType: value.type } : { valueType: value.type }
781
- );
782
- }
783
- return value.value;
784
- }
785
- function requireKnownBodyKind(kind, ref, op) {
786
- if (kind !== 0 && kind !== 1 && kind !== 2) {
787
- throw malformedBytecode(
788
- "MALFORMED_BYTECODE_BODY_KIND",
789
- op,
790
- `has body kind ${kind}, which is not one this VM knows`,
791
- "0 (inline body), 1 (builtin function) or 2 (user-defined function)",
792
- `${kind}`,
793
- { kind, ref }
794
- );
795
- }
796
- }
797
- function parseBigIntLiteral(text, op) {
798
- try {
799
- return BigInt(text);
800
- } catch {
801
- throw malformedBytecode(
802
- "MALFORMED_BYTECODE_BIGINT_LITERAL",
803
- op,
804
- `cannot read "${text}" as a whole number`,
805
- "a string holding an integer, with no decimal point or separators",
806
- `"${text}"`,
807
- { literal: text }
808
- );
809
- }
810
- }
811
- function unrunnableProgram(bytecode) {
812
- if (bytecode === null || typeof bytecode !== "object") {
813
- return `expected a bytecode program, got ${bytecode === null ? "null" : typeof bytecode}`;
814
- }
815
- const candidate = bytecode;
816
- if (typeof candidate.opcodes?.length !== "number") {
817
- return "the program has no `opcodes` array";
818
- }
819
- if (typeof candidate.numbers?.length !== "number") {
820
- return "the program has no `numbers` pool";
821
- }
822
- if (typeof candidate.strings?.length !== "number") {
823
- return "the program has no `strings` pool";
824
- }
825
- return null;
826
- }
827
- function invokeFrameBody(params, program, args, vm, pipeline, expression, context, symbolicTolerant) {
828
- const frame = /* @__PURE__ */ new Map();
829
- for (let i = 0; i < params.length; i++) frame.set(params[i], args[i]);
830
- vm.pushCallFrame(frame);
831
- let bodyResult;
832
- try {
833
- bodyResult = executeBytecode(program, vm, pipeline, expression, context, symbolicTolerant);
834
- } finally {
835
- vm.popCallFrame();
836
- }
837
- if (bodyResult.type === "pending") {
838
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution(
839
- "MAP_REDUCE_ASYNC_UNSUPPORTED",
840
- `map/reduce transform bodies calling an async operation (weather, stocks, currency, ...) aren't supported`
841
- );
842
- }
843
- if (bodyResult.type === "error") {
844
- throw bodyResult.error;
845
- }
846
- return bodyResult.value;
847
- }
848
- function invokeWithBoundUnknown(name, program, vm, pipeline, expression, context, symbolicTolerant) {
849
- const frame = new Map(vm.getCallFrame());
850
- frame.set(name, chunk2TZKENDH_cjs.symbolicValue(chunkHIQ5HSZL_cjs.varNode(name)));
851
- vm.pushCallFrame(frame);
852
- let bodyResult;
853
- try {
854
- bodyResult = executeBytecode(program, vm, pipeline, expression, context, symbolicTolerant);
855
- } finally {
856
- vm.popCallFrame();
857
- }
858
- if (bodyResult.type === "pending") {
859
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution(
860
- "SYMBOLIC_ASYNC_UNSUPPORTED",
861
- `an algebra verb's expression cannot call an async operation (weather, stocks, currency, ...)`
862
- );
863
- }
864
- if (bodyResult.type === "error") {
865
- throw bodyResult.error;
866
- }
867
- return bodyResult.value;
868
- }
869
- function unifyRatePeriods(l, r) {
870
- if (l.type !== 6 /* Uom */ || r.type !== 6 /* Uom */) return null;
871
- const leftUnit = l.unit;
872
- const rightUnit = r.unit;
873
- if (leftUnit === void 0 || rightUnit === void 0) return null;
874
- const leftSlash = leftUnit.indexOf("/");
875
- const rightSlash = rightUnit.indexOf("/");
876
- if (leftSlash < 0 || rightSlash < 0) return null;
877
- if (leftUnit.slice(0, leftSlash) !== rightUnit.slice(0, rightSlash)) return null;
878
- const leftPeriod = chunkAMOJYLG2_cjs.UNIT_TABLE[leftUnit.slice(leftSlash + 1).toLowerCase()];
879
- const rightPeriod = chunkAMOJYLG2_cjs.UNIT_TABLE[rightUnit.slice(rightSlash + 1).toLowerCase()];
880
- if (leftPeriod === void 0 || rightPeriod === void 0) return null;
881
- if (leftPeriod[0] !== rightPeriod[0]) return null;
882
- return l.toNumber() * (rightPeriod[1] / leftPeriod[1]);
883
- }
884
- function moneyTimesQuantity(l, r) {
885
- if (l.type !== 6 /* Uom */ || r.type !== 6 /* Uom */) return null;
886
- const leftUnit = l.unit;
887
- const rightUnit = r.unit;
888
- if (leftUnit === void 0 || rightUnit === void 0) return null;
889
- if (leftUnit.includes("/") || rightUnit.includes("/")) return null;
890
- const leftIsMoney = chunkHIQ5HSZL_cjs.CURRENCY_DISPLAY[leftUnit.toUpperCase()] !== void 0;
891
- const rightIsMoney = chunkHIQ5HSZL_cjs.CURRENCY_DISPLAY[rightUnit.toUpperCase()] !== void 0;
892
- if (leftIsMoney === rightIsMoney) return null;
893
- return chunk2TZKENDH_cjs.uomValue(l.toNumber() * r.toNumber(), leftIsMoney ? leftUnit : rightUnit);
894
- }
895
- function combinePercentage(l, r, sign) {
896
- if (l.type === 5 /* Percentage */) {
897
- if (r.type === 6 /* Uom */ && r.unit !== void 0) {
898
- return chunk7ZX6B7SY_cjs.scaleMoneyByPercent(r, r.unit, l.toNumber(), sign);
899
- }
900
- if (r.type !== 5 /* Percentage */ && r.type !== 0 /* Number */) return null;
901
- return chunk2TZKENDH_cjs.percentageValue(l.toNumber() + sign * r.toNumber());
902
- }
903
- if (r.type !== 5 /* Percentage */) return null;
904
- const factor = 1 + sign * r.toNumber();
905
- if (l.type === 0 /* Number */) {
906
- const scaled = l.toNumber() * factor;
907
- if (l.uncertainty !== void 0) return chunk2TZKENDH_cjs.numberValueUncertain(scaled, Math.abs(l.uncertainty * factor));
908
- return chunk2TZKENDH_cjs.numberValue(scaled);
909
- }
910
- if (l.type === 6 /* Uom */ && l.unit !== void 0) return chunk7ZX6B7SY_cjs.scaleMoneyByPercent(l, l.unit, r.toNumber(), sign);
911
- return null;
912
- }
913
- function multiplyPercentWithUncertainty(l, r) {
914
- const pct = l.type === 5 /* Percentage */ ? l : r.type === 5 /* Percentage */ ? r : null;
915
- if (pct === null) return null;
916
- const other = pct === l ? r : l;
917
- if (other.type !== 0 /* Number */ || other.uncertainty === void 0) return null;
918
- const factor = pct.toNumber();
919
- return chunk2TZKENDH_cjs.numberValueUncertain(other.toNumber() * factor, Math.abs(other.uncertainty * factor));
920
- }
921
- function multiplyMoneyByScalarExact(l, r) {
922
- const money = l.type === 6 /* Uom */ ? l : r;
923
- const scalar = l.type === 6 /* Uom */ ? r : l;
924
- if (money.type !== 6 /* Uom */ || money.unit === void 0 || !chunkZVTWQLK4_cjs.sharedCurrencyExchange.isCurrency(money.unit)) return null;
925
- if (scalar.type !== 0 /* Number */ && scalar.type !== 5 /* Percentage */) return null;
926
- if (scalar.rational !== void 0) return null;
927
- return chunk7ZX6B7SY_cjs.scaleMoneyExact(money, scalar.toNumber(), money.unit);
928
- }
929
- function dividePercentWithUncertainty(l, r) {
930
- if (r.type === 5 /* Percentage */ && l.type === 0 /* Number */ && l.uncertainty !== void 0) {
931
- const factor = r.toNumber();
932
- if (factor === 0) return null;
933
- return chunk2TZKENDH_cjs.numberValueUncertain(l.toNumber() / factor, Math.abs(l.uncertainty / factor));
934
- }
935
- if (l.type === 5 /* Percentage */ && r.type === 0 /* Number */ && r.uncertainty !== void 0) {
936
- const b = r.toNumber();
937
- if (b === 0) return null;
938
- return chunk2TZKENDH_cjs.numberValueUncertain(l.toNumber() / b, Math.abs(l.toNumber() * r.uncertainty / (b * b)));
939
- }
940
- return null;
941
- }
942
- function extractDurationMs(value) {
943
- if (value.type === 6 /* Uom */) {
944
- const unit = value.unit;
945
- if (unit && chunkEJ3ILXX6_cjs.getMeasure(unit) === "time") {
946
- try {
947
- return chunkEJ3ILXX6_cjs.convertUnit(value.toNumber(), unit, "ms");
948
- } catch {
949
- }
950
- }
951
- return 0;
952
- }
953
- return value.toNumber();
954
- }
955
- var WORKDAYS_PER_YEAR = 260;
956
- function addBusinessDays2(epochMs, n, vm) {
957
- const remaining = Math.trunc(Math.abs(n));
958
- const direction = n >= 0 ? 1 : -1;
959
- const limitYears = direction > 0 ? vm.getMaxDateOffsetYears() : -vm.getMinDateOffsetYears();
960
- const limitWorkdays = Math.floor(limitYears * WORKDAYS_PER_YEAR);
961
- if (remaining > limitWorkdays) {
962
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution(
963
- "DATE_OFFSET_LIMIT_EXCEEDED",
964
- `A date offset of ${remaining.toLocaleString("en-US")} workdays is about ${Math.round(remaining / WORKDAYS_PER_YEAR).toLocaleString("en-US")} years, past the limit of ${limitYears} years for a workday offset`,
965
- { requestedWorkdays: remaining, limitYears, limitWorkdays }
966
- );
967
- }
968
- const maxCalendarSteps = limitWorkdays * 7 + 7;
969
- const landed = addBusinessDays(epochMs, n, (ms) => vm.isHoliday(ms), maxCalendarSteps);
970
- if (landed === null) {
971
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution(
972
- "DATE_OFFSET_LIMIT_EXCEEDED",
973
- `A working-day offset of ${remaining.toLocaleString("en-US")} could not be reached within the ${limitYears}-year limit; the configured holiday calendar leaves too few working days`,
974
- { requestedWorkdays: remaining, limitYears, maxCalendarSteps }
975
- );
976
- }
977
- return landed;
978
- }
979
- var MS_PER_DAY2 = 864e5;
980
- var CALENDAR_MONTHS_PER_UNIT = {
981
- month: 1,
982
- months: 1,
983
- mo: 1,
984
- year: 12,
985
- years: 12,
986
- yr: 12,
987
- y: 12,
988
- a: 12,
989
- decade: 120,
990
- decades: 120,
991
- dec: 120,
992
- century: 1200,
993
- centuries: 1200,
994
- millennium: 12e3,
995
- millennia: 12e3
996
- };
997
- function daysInMonth(year, monthIndex) {
998
- return new Date(year, monthIndex + 1, 0).getDate();
999
- }
1000
- function addCalendarDays(epochMs, days) {
1001
- const whole = Math.trunc(days);
1002
- const date = new Date(epochMs);
1003
- date.setDate(date.getDate() + whole);
1004
- const shifted = date.getTime();
1005
- if (Number.isNaN(shifted)) return epochMs + days * MS_PER_DAY2;
1006
- return shifted + (days - whole) * MS_PER_DAY2;
1007
- }
1008
- function addCalendarMonths(epochMs, months) {
1009
- const whole = Math.trunc(months);
1010
- const date = new Date(epochMs);
1011
- const dayOfMonth = date.getDate();
1012
- date.setDate(1);
1013
- date.setMonth(date.getMonth() + whole);
1014
- date.setDate(Math.min(dayOfMonth, daysInMonth(date.getFullYear(), date.getMonth())));
1015
- const shifted = date.getTime();
1016
- const monthMs = chunkEJ3ILXX6_cjs.convertUnit(1, "month", "ms");
1017
- if (Number.isNaN(shifted)) return epochMs + months * monthMs;
1018
- return shifted + (months - whole) * monthMs;
1019
- }
1020
- function shiftDatetime(epochMs, duration, sign, vm) {
1021
- if (duration.type === 6 /* Uom */ && duration.unit !== void 0) {
1022
- const unit = duration.unit;
1023
- const amount = sign * duration.toNumber();
1024
- if (chunkEJ3ILXX6_cjs.isWorkdayUnit(unit)) return addBusinessDays2(epochMs, amount, vm);
1025
- const monthsPerUnit = CALENDAR_MONTHS_PER_UNIT[unit];
1026
- if (monthsPerUnit !== void 0) return addCalendarMonths(epochMs, amount * monthsPerUnit);
1027
- if (chunkEJ3ILXX6_cjs.getMeasure(unit) === "time") {
1028
- let daysPerUnit = 0;
1029
- try {
1030
- daysPerUnit = chunkEJ3ILXX6_cjs.convertUnit(1, unit, "day");
1031
- } catch {
1032
- }
1033
- if (Number.isInteger(daysPerUnit) && daysPerUnit >= 1) {
1034
- return addCalendarDays(epochMs, amount * daysPerUnit);
1035
- }
1036
- }
1037
- }
1038
- return epochMs + sign * extractDurationMs(duration);
1039
- }
1040
- function combineTimecode(tc, r, sign) {
1041
- const fps = chunk2TZKENDH_cjs.timecodeFps(tc.unit);
1042
- if (r.type === 6 /* Uom */ && chunk2TZKENDH_cjs.isTimecodeUnit(r.unit)) {
1043
- const rFps = chunk2TZKENDH_cjs.timecodeFps(r.unit);
1044
- if (rFps !== fps) {
1045
- return chunk2TZKENDH_cjs.errorValue(
1046
- "TIMECODE_FPS_MISMATCH",
1047
- `Cannot combine timecodes at different frame rates (${fps} fps vs ${rFps} fps)`
1048
- );
1049
- }
1050
- return sign === 1 ? chunk2TZKENDH_cjs.uomValue(tc.toNumber() + r.toNumber(), tc.unit) : chunk2TZKENDH_cjs.uomValue(tc.toNumber() - r.toNumber(), "frames");
1051
- }
1052
- if (r.type === 6 /* Uom */ && r.unit === "frames") {
1053
- return chunk2TZKENDH_cjs.uomValue(tc.toNumber() + sign * r.toNumber(), tc.unit);
1054
- }
1055
- if (r.type === 6 /* Uom */ && r.unit && chunkEJ3ILXX6_cjs.getMeasure(r.unit) === "time") {
1056
- const seconds = chunkEJ3ILXX6_cjs.convertUnit(r.toNumber(), r.unit, "s");
1057
- return chunk2TZKENDH_cjs.uomValue(tc.toNumber() + sign * seconds * fps, tc.unit);
1058
- }
1059
- return chunk2TZKENDH_cjs.uomValue(tc.toNumber() + sign * r.toNumber(), tc.unit);
1060
- }
1061
- function isTruthy(value) {
1062
- if (value.type === 10 /* Boolean */) return value.value;
1063
- return value.toNumber() !== 0;
1064
- }
1065
- function incompatibleConversionError(fromUnit, toUnit) {
1066
- const named = chunk7ZX6B7SY_cjs.describeConversionMismatch(fromUnit, toUnit);
1067
- return chunk2TZKENDH_cjs.errorValue(
1068
- "INCOMPATIBLE_UNITS",
1069
- named ?? `Cannot convert ${fromUnit} to ${toUnit}: they do not measure the same thing`
1070
- );
1071
- }
1072
- var MAX_EXACT_POW_BITS = 65536;
1073
- function exactPowBits(base, exponent) {
1074
- if (!Number.isInteger(exponent) || exponent < 0) return null;
1075
- if (exponent === 0) return 1;
1076
- const magnitude = Math.abs(base.toNumber());
1077
- if (magnitude <= 1) return 1;
1078
- const baseBits = magnitude <= 2 ? 1 : Math.log2(magnitude);
1079
- return baseBits * exponent;
1080
- }
1081
- function bigIntPow(base, exponent) {
1082
- let result = 1n;
1083
- let factor = base;
1084
- let remaining = exponent;
1085
- while (remaining > 0n) {
1086
- if (remaining % 2n === 1n) result *= factor;
1087
- remaining /= 2n;
1088
- if (remaining > 0n) factor *= factor;
1089
- }
1090
- return result;
1091
- }
1092
- var MAX_EXACT_SHIFT_BITS = MAX_EXACT_POW_BITS;
1093
- function bigIntBitLength(value) {
1094
- const magnitude = value < 0n ? -value : value;
1095
- if (magnitude === 0n) return 0;
1096
- const asDouble = Number(magnitude);
1097
- if (Number.isFinite(asDouble)) return Math.floor(Math.log2(asDouble)) + 1;
1098
- return magnitude.toString(16).length * 4;
1099
- }
1100
- function bigIntShift(l, r, direction) {
1101
- const value = chunk7ZX6B7SY_cjs.toBigIntOperand(l);
1102
- const shift = chunk7ZX6B7SY_cjs.toBigIntOperand(r);
1103
- if (value === 0n) return chunk2TZKENDH_cjs.bigIntValue(0n);
1104
- const grownBits = direction * Number(shift);
1105
- if (grownBits <= 0 || bigIntBitLength(value) + grownBits <= MAX_EXACT_SHIFT_BITS) {
1106
- return chunk2TZKENDH_cjs.bigIntValue(direction === 1 ? value << shift : value >> shift);
1107
- }
1108
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution(
1109
- "BIGINT_SHIFT_LIMIT_EXCEEDED",
1110
- `Shifting by ${shift} would build an exact integer of about ${(bigIntBitLength(value) + grownBits).toLocaleString("en-US")} bits, past the limit of ${MAX_EXACT_SHIFT_BITS.toLocaleString("en-US")} bits`,
1111
- { shift: String(shift), limitBits: MAX_EXACT_SHIFT_BITS }
1112
- );
1113
- }
1114
- function multiplyRateByMatchingUom(rate, multiplier) {
1115
- const { numerator, denominator } = chunk2TZKENDH_cjs.splitRateUnit(rate.unit);
1116
- const rateMeasure = chunkEJ3ILXX6_cjs.getMeasure(denominator);
1117
- const multiplierMeasure = chunkEJ3ILXX6_cjs.getMeasure(multiplier.unit);
1118
- if (!rateMeasure || rateMeasure !== multiplierMeasure) {
1119
- return chunk2TZKENDH_cjs.errorValue(
1120
- "RATE_MUL_MEASURE_MISMATCH",
1121
- `Cannot multiply a "${denominator}"-denominated rate by "${multiplier.unit}" \u2014 different measures`
1122
- );
1123
- }
1124
- const multiplierInDenominatorUnit = chunkEJ3ILXX6_cjs.convertUnit(multiplier.toNumber(), multiplier.unit, denominator);
1125
- const total = rate.toNumber() * multiplierInDenominatorUnit;
1126
- return numerator ? chunk2TZKENDH_cjs.uomValue(total, numerator) : chunk2TZKENDH_cjs.numberValue(total);
1127
- }
1128
- function toFractionString(n) {
1129
- if (Number.isNaN(n)) return "NaN";
1130
- if (!isFinite(n)) return n > 0 ? "Infinity" : "-Infinity";
1131
- const negative = n < 0;
1132
- const abs = Math.abs(n);
1133
- const whole = Math.floor(abs);
1134
- const frac = abs - whole;
1135
- if (frac < 1e-9) return `${negative ? "-" : ""}${whole}`;
1136
- let h0 = 0, h1 = 1, k0 = 1, k1 = 0;
1137
- let b = frac;
1138
- const maxDenominator = 1e6;
1139
- for (let i = 0; i < 30; i++) {
1140
- const a = Math.floor(b + 1e-9);
1141
- const h2 = a * h1 + h0, k2 = a * k1 + k0;
1142
- if (k2 > maxDenominator) break;
1143
- h0 = h1;
1144
- h1 = h2;
1145
- k0 = k1;
1146
- k1 = k2;
1147
- if (Math.abs(frac - h1 / k1) < 1e-9) break;
1148
- const rem = b - a;
1149
- if (rem < 1e-9) break;
1150
- b = 1 / rem;
1151
- }
1152
- const numerator = whole * k1 + h1;
1153
- return `${negative ? "-" : ""}${numerator}/${k1}`;
1154
- }
1155
- function rationalToFractionString(r) {
1156
- return r.d === 1n ? String(r.n) : `${r.n}/${r.d}`;
1157
- }
1158
- function toMultiplierString(value) {
1159
- const n = value.toNumber();
1160
- const multiple = value.type === 5 /* Percentage */ ? 1 + n : n;
1161
- return `${Math.round(multiple * 1e6) / 1e6}x`;
1162
- }
1163
- function toScientificString(n) {
1164
- if (!Number.isFinite(n)) return String(n);
1165
- if (n === 0) return "0e+0";
1166
- const [mantissa, exponent] = n.toExponential().split("e");
1167
- const trimmed = mantissa.includes(".") ? mantissa.replace(/0+$/, "").replace(/\.$/, "") : mantissa;
1168
- return `${trimmed}e${exponent}`;
1169
- }
1170
- function executeBytecode(bytecode, vm, pipeline, expression, context, symbolicTolerant) {
1171
- const unrunnable = unrunnableProgram(bytecode);
1172
- if (unrunnable) {
1173
- return {
1174
- type: "error",
1175
- error: chunkB4HBEFTB_cjs.ErrorFactory.validation({
1176
- code: "MALFORMED_BYTECODE_PROGRAM",
1177
- message: `Malformed bytecode: ${unrunnable}`,
1178
- expected: "a BytecodeProgram with opcodes, numbers and strings",
1179
- found: unrunnable,
1180
- suggestion: MALFORMED_BYTECODE_SUGGESTION
1181
- })
1182
- };
1183
- }
1184
- const { opcodes, numbers, strings, userFunctionBodies, anonymousBodies } = bytecode;
1185
- let ip = 0;
1186
- let localInstructionCount = 0;
1187
- const maxInstructions = vm.getMaxInstructions();
1188
- const maxStackDepth = vm.getMaxStackDepth();
1189
- const stack = vm.getStack();
1190
- const shouldTrace = pipeline?.hasCollectors ?? false;
1191
- const hasArena = chunk2TZKENDH_cjs.isArenaActive();
1192
- if (opcodes.length === 0) return { type: "value", value: chunk2TZKENDH_cjs.numberValue(0) };
1193
- chunk2TZKENDH_cjs.beginEvaluation(vm);
1194
- try {
1195
- while (ip < opcodes.length) {
1196
- if (++localInstructionCount > maxInstructions) {
1197
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution("INSTRUCTION_LIMIT_EXCEEDED", `Execution exceeded maximum of ${maxInstructions} instructions`);
1198
- }
1199
- if (stack.length > maxStackDepth) {
1200
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution("STACK_LIMIT_EXCEEDED", `Execution exceeded maximum stack depth of ${maxStackDepth}`);
1201
- }
1202
- const op = opcodes[ip++];
1203
- if (shouldTrace) {
1204
- const stackSnapshot = stack.map((v) => ({
1205
- type: v.type,
1206
- value: v.value,
1207
- unit: v.unit
1208
- }));
1209
- pipeline.fireVmStep({
1210
- type: chunkXA4CKRML_cjs.DiagnosticEventType.VmStep,
1211
- elapsedNs: 0,
1212
- expression: expression ?? "",
1213
- opcode: op,
1214
- opcodeName: chunkXIYYHA65_cjs.getOpCodeName(op),
1215
- ip: ip - 1,
1216
- stackDepth: stack.length,
1217
- instructionNumber: localInstructionCount,
1218
- stack: stackSnapshot
1219
- });
1220
- }
1221
- switch (op) {
1222
- // ═══════════════════════════════════════════════════════════════
1223
- // §1 Stack operations (OpCode 0–3)
1224
- // ═══════════════════════════════════════════════════════════════
1225
- case 0 /* NOP */:
1226
- break;
1227
- case 1 /* HALT */: {
1228
- const result = safePop(stack);
1229
- return { type: "value", value: hasArena ? chunk2TZKENDH_cjs.persistentValue(result) : result };
1230
- }
1231
- case 3 /* DUP */: {
1232
- const top = safePop(stack);
1233
- stack.push(top);
1234
- stack.push(top);
1235
- break;
1236
- }
1237
- case 2 /* SWAP */: {
1238
- const a = safePop(stack), b = safePop(stack);
1239
- stack.push(a);
1240
- stack.push(b);
1241
- break;
1242
- }
1243
- // ═══════════════════════════════════════════════════════════════
1244
- // §2 Push literals (OpCode 10–15)
1245
- // ═══════════════════════════════════════════════════════════════
1246
- // Every operand below goes through a checked read. An index past the
1247
- // end of a pool used to yield `undefined` and be pushed as a Value,
1248
- // which then failed somewhere else entirely: PUSH_BIGINT reached
1249
- // `BigInt(undefined)`, and an undefined string sat on the stack until
1250
- // a unit or converter name was read off it.
1251
- case 10 /* PUSH_NUMBER */:
1252
- stack.push(chunk2TZKENDH_cjs.numberValue(numbers[poolIndex(opcodes, ip++, op, "constant-pool index", numbers.length, "number-pool")]));
1253
- break;
1254
- case 11 /* PUSH_BIGINT */:
1255
- stack.push(chunk2TZKENDH_cjs.bigIntValue(parseBigIntLiteral(poolString(opcodes, ip++, strings, op, "constant-pool index"), op)));
1256
- break;
1257
- case 16 /* PUSH_DECIMAL */: {
1258
- const dec = chunkHIQ5HSZL_cjs.decimalFromLiteral(poolString(opcodes, ip++, strings, op, "constant-pool index"));
1259
- stack.push(chunk2TZKENDH_cjs.numberValueExact(chunkHIQ5HSZL_cjs.decimalToNumber(dec), dec));
1260
- break;
1261
- }
1262
- case 12 /* PUSH_HEX */:
1263
- stack.push(chunk2TZKENDH_cjs.hexValue(numbers[poolIndex(opcodes, ip++, op, "constant-pool index", numbers.length, "number-pool")]));
1264
- break;
1265
- case 13 /* PUSH_STRING */:
1266
- stack.push(chunk2TZKENDH_cjs.stringValue(poolString(opcodes, ip++, strings, op, "constant-pool index")));
1267
- break;
1268
- case 14 /* PUSH_BOOLEAN */:
1269
- stack.push(chunk2TZKENDH_cjs.boolValue(operandByte(opcodes, ip++, op, "boolean operand") === 1));
1270
- break;
1271
- // ═══════════════════════════════════════════════════════════════
1272
- // §3 Arithmetic (OpCode 20–27)
1273
- // Binary ops (ADD/SUB/MUL/DIV/MOD/EXP) have inlined numeric
1274
- // fast paths; unary ops (NEG/POS) handle BigInt and UoM.
1275
- // ═══════════════════════════════════════════════════════════════
1276
- case 20 /* ADD */: {
1277
- const r = safePop(stack), l = safePop(stack);
1278
- const addFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1279
- if (addFault) {
1280
- stack.push(addFault);
1281
- break;
1282
- }
1283
- if (l.uncertainty !== void 0 || r.uncertainty !== void 0) {
1284
- const uncAdd = chunk7ZX6B7SY_cjs.uncertainOp(l, r, "add");
1285
- if (uncAdd) {
1286
- stack.push(uncAdd);
1287
- break;
1288
- }
1289
- }
1290
- if (l.rational !== void 0 || r.rational !== void 0) {
1291
- const ratAdd = chunk7ZX6B7SY_cjs.exactRationalOp(l, r, "add");
1292
- if (ratAdd) {
1293
- stack.push(ratAdd);
1294
- break;
1295
- }
1296
- }
1297
- const pctAdd = combinePercentage(l, r, 1);
1298
- const ratePeriodAdd = pctAdd === null ? unifyRatePeriods(l, r) : null;
1299
- if (pctAdd !== null) {
1300
- stack.push(pctAdd);
1301
- } else if (ratePeriodAdd !== null) {
1302
- stack.push(chunk2TZKENDH_cjs.uomValue(ratePeriodAdd + r.toNumber(), r.unit));
1303
- } else if (l.type === 0 /* Number */ && r.type === 0 /* Number */) {
1304
- stack.push(chunk2TZKENDH_cjs.numberValue(l.value + r.value));
1305
- } else if (l.type === 10 /* Boolean */ && r.type === 10 /* Boolean */) {
1306
- stack.push(chunk2TZKENDH_cjs.boolValue(l.value && r.value));
1307
- } else if (l.type === 4 /* Datetime */) {
1308
- if (r.type === 4 /* Datetime */) {
1309
- stack.push(chunk2TZKENDH_cjs.errorValue("INVALID_DATETIME_OP", "Cannot add two datetimes together"));
1310
- } else {
1311
- stack.push(chunk2TZKENDH_cjs.datetimeValue(shiftDatetime(l.toNumber(), r, 1, vm)));
1312
- }
1313
- } else if (l.type === 6 /* Uom */ && chunk2TZKENDH_cjs.isTimecodeUnit(l.unit)) {
1314
- stack.push(combineTimecode(l, r, 1));
1315
- } else if (r.type === 4 /* Datetime */) {
1316
- stack.push(chunk2TZKENDH_cjs.datetimeValue(shiftDatetime(r.toNumber(), l, 1, vm)));
1317
- } else {
1318
- stack.push(chunk7ZX6B7SY_cjs.binaryOp(l, r, (a, b) => a + b, (a, b) => a + b, "add"));
1319
- }
1320
- break;
1321
- }
1322
- case 21 /* SUB */: {
1323
- const r = safePop(stack), l = safePop(stack);
1324
- const subFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1325
- if (subFault) {
1326
- stack.push(subFault);
1327
- break;
1328
- }
1329
- if (l.uncertainty !== void 0 || r.uncertainty !== void 0) {
1330
- const uncSub = chunk7ZX6B7SY_cjs.uncertainOp(l, r, "sub");
1331
- if (uncSub) {
1332
- stack.push(uncSub);
1333
- break;
1334
- }
1335
- }
1336
- if (l.rational !== void 0 || r.rational !== void 0) {
1337
- const ratSub = chunk7ZX6B7SY_cjs.exactRationalOp(l, r, "sub");
1338
- if (ratSub) {
1339
- stack.push(ratSub);
1340
- break;
1341
- }
1342
- }
1343
- const pctSub = combinePercentage(l, r, -1);
1344
- const ratePeriodSub = pctSub === null ? unifyRatePeriods(l, r) : null;
1345
- if (pctSub !== null) {
1346
- stack.push(pctSub);
1347
- } else if (ratePeriodSub !== null) {
1348
- stack.push(chunk2TZKENDH_cjs.uomValue(ratePeriodSub - r.toNumber(), r.unit));
1349
- } else if (l.type === 0 /* Number */ && r.type === 0 /* Number */) {
1350
- stack.push(chunk2TZKENDH_cjs.numberValue(l.value - r.value));
1351
- } else if (l.type === 4 /* Datetime */) {
1352
- if (r.type === 4 /* Datetime */) {
1353
- stack.push(chunk2TZKENDH_cjs.uomValue(l.toNumber() - r.toNumber(), "ms"));
1354
- } else {
1355
- stack.push(chunk2TZKENDH_cjs.datetimeValue(shiftDatetime(l.toNumber(), r, -1, vm)));
1356
- }
1357
- } else if (l.type === 6 /* Uom */ && chunk2TZKENDH_cjs.isTimecodeUnit(l.unit)) {
1358
- stack.push(combineTimecode(l, r, -1));
1359
- } else if (r.type === 4 /* Datetime */) {
1360
- stack.push(chunk2TZKENDH_cjs.errorValue(
1361
- "INVALID_DATETIME_OP",
1362
- "Cannot subtract a datetime from a value that is not a datetime"
1363
- ));
1364
- } else {
1365
- stack.push(chunk7ZX6B7SY_cjs.binaryOp(l, r, (a, b) => a - b, (a, b) => a - b, "sub"));
1366
- }
1367
- break;
1368
- }
1369
- case 22 /* MUL */: {
1370
- const r = safePop(stack), l = safePop(stack);
1371
- const pctUnc = multiplyPercentWithUncertainty(l, r);
1372
- if (pctUnc) {
1373
- stack.push(pctUnc);
1374
- break;
1375
- }
1376
- if (l.uncertainty !== void 0 || r.uncertainty !== void 0) {
1377
- const uncMul = chunk7ZX6B7SY_cjs.uncertainOp(l, r, "mul");
1378
- if (uncMul) {
1379
- stack.push(uncMul);
1380
- break;
1381
- }
1382
- }
1383
- if (l.rational !== void 0 || r.rational !== void 0) {
1384
- const ratMul = chunk7ZX6B7SY_cjs.exactRationalOp(l, r, "mul");
1385
- if (ratMul) {
1386
- stack.push(ratMul);
1387
- break;
1388
- }
1389
- }
1390
- const moneyScalar = multiplyMoneyByScalarExact(l, r);
1391
- if (moneyScalar) {
1392
- stack.push(moneyScalar);
1393
- break;
1394
- }
1395
- if (l.type === 0 /* Number */ && r.type === 0 /* Number */) {
1396
- stack.push(chunk2TZKENDH_cjs.numberValue(l.value * r.value));
1397
- } else if (l.type === 7 /* Matrix */ && r.type === 7 /* Matrix */) {
1398
- chunk2TZKENDH_cjs.checkAllocation(matrixProductCells(l.value, r.value), "matrix cells");
1399
- stack.push(chunkHIQ5HSZL_cjs.matrixMultiply(l.value, r.value));
1400
- } else if (l.type === 6 /* Uom */ && chunk2TZKENDH_cjs.isRateUnit(l.unit) && r.type === 6 /* Uom */ && r.unit) {
1401
- stack.push(multiplyRateByMatchingUom(l, r));
1402
- } else if (r.type === 6 /* Uom */ && chunk2TZKENDH_cjs.isRateUnit(r.unit) && l.type === 6 /* Uom */ && l.unit) {
1403
- stack.push(multiplyRateByMatchingUom(r, l));
1404
- } else if (moneyTimesQuantity(l, r) !== null) {
1405
- stack.push(moneyTimesQuantity(l, r));
1406
- } else {
1407
- stack.push(chunk7ZX6B7SY_cjs.binaryOp(l, r, (a, b) => a * b, (a, b) => a * b, "mul"));
1408
- }
1409
- break;
1410
- }
1411
- case 23 /* DIV */: {
1412
- const r = safePop(stack), l = safePop(stack);
1413
- const pctDivUnc = dividePercentWithUncertainty(l, r);
1414
- if (pctDivUnc) {
1415
- stack.push(pctDivUnc);
1416
- break;
1417
- }
1418
- if (l.uncertainty !== void 0 || r.uncertainty !== void 0) {
1419
- const uncDiv = chunk7ZX6B7SY_cjs.uncertainOp(l, r, "div");
1420
- if (uncDiv) {
1421
- stack.push(uncDiv);
1422
- break;
1423
- }
1424
- }
1425
- if (l.type === 6 /* Uom */ && r.type === 6 /* Uom */) {
1426
- const { lv, rv, sameMeasure } = chunk7ZX6B7SY_cjs.unifyUom(l, r);
1427
- if (sameMeasure) {
1428
- stack.push(chunk2TZKENDH_cjs.numberValue(lv / rv));
1429
- } else if (chunkZVTWQLK4_cjs.sharedCurrencyExchange.isCurrency(l.unit) && chunkZVTWQLK4_cjs.sharedCurrencyExchange.isCurrency(r.unit)) {
1430
- stack.push(chunk2TZKENDH_cjs.errorValue("INCOMPATIBLE_UNITS", `Cannot combine incompatible units: ${l.unit} and ${r.unit}`));
1431
- } else {
1432
- stack.push(chunk2TZKENDH_cjs.rateValue(lv / rv, l.unit, r.unit));
1433
- }
1434
- } else {
1435
- const ratDiv = chunk7ZX6B7SY_cjs.exactRationalOp(l, r, "div");
1436
- if (ratDiv) {
1437
- stack.push(ratDiv);
1438
- break;
1439
- }
1440
- stack.push(chunk7ZX6B7SY_cjs.binaryOp(l, r, (a, b) => a / b, (a, b) => {
1441
- if (b === 0n) throw chunk7ZX6B7SY_cjs.bigIntDivisionByZero();
1442
- return a / b;
1443
- }, "div"));
1444
- }
1445
- break;
1446
- }
1447
- case 24 /* MOD */: {
1448
- const r = safePop(stack), l = safePop(stack);
1449
- stack.push(chunk7ZX6B7SY_cjs.binaryOp(l, r, (a, b) => a % b, (a, b) => {
1450
- if (b === 0n) throw chunk7ZX6B7SY_cjs.bigIntDivisionByZero();
1451
- return a % b;
1452
- }));
1453
- break;
1454
- }
1455
- case 25 /* EXP */: {
1456
- const r = safePop(stack), l = safePop(stack);
1457
- if (l.type === 13 /* Error */) {
1458
- stack.push(l);
1459
- break;
1460
- }
1461
- if (r.type === 13 /* Error */) {
1462
- stack.push(r);
1463
- break;
1464
- }
1465
- if (l.type === 12 /* Pending */) {
1466
- stack.push(l);
1467
- break;
1468
- }
1469
- if (r.type === 12 /* Pending */) {
1470
- stack.push(r);
1471
- break;
1472
- }
1473
- if (l.type === 0 /* Number */ && r.type === 0 /* Number */) {
1474
- stack.push(chunk2TZKENDH_cjs.numberValue(chunk7ZX6B7SY_cjs.power(l.value, r.value)));
1475
- break;
1476
- }
1477
- if (l.type === 7 /* Matrix */ || r.type === 7 /* Matrix */) {
1478
- if (l.type !== 7 /* Matrix */ || r.type !== 0 /* Number */) {
1479
- stack.push(chunk2TZKENDH_cjs.errorValue(
1480
- "MATRIX_POWER_UNSUPPORTED",
1481
- `^: a matrix may only be the base, raised to a whole number (as in "[1,2;3,4]^2"); "${chunk2TZKENDH_cjs.ValueType[l.type]} ^ ${chunk2TZKENDH_cjs.ValueType[r.type]}" has no matrix reading.`
1482
- ));
1483
- break;
1484
- }
1485
- chunk2TZKENDH_cjs.checkAllocation(matrixPowerCells(l.value, r.value), "matrix cells");
1486
- stack.push(chunkHIQ5HSZL_cjs.matrixPower(l.value, r.value));
1487
- break;
1488
- }
1489
- if (l.type === 9 /* Symbolic */ || r.type === 9 /* Symbolic */) {
1490
- stack.push(chunk7ZX6B7SY_cjs.symbolicPow(l, r));
1491
- break;
1492
- }
1493
- if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1494
- const powBits = exactPowBits(l, r.toNumber());
1495
- if (powBits !== null) {
1496
- if (powBits > MAX_EXACT_POW_BITS) {
1497
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution(
1498
- "BIGINT_POW_LIMIT_EXCEEDED",
1499
- `That power would build an exact integer of about ${Math.round(powBits).toLocaleString("en-US")} bits, past the limit of ${MAX_EXACT_POW_BITS.toLocaleString("en-US")} bits`,
1500
- { limitBits: MAX_EXACT_POW_BITS }
1501
- );
1502
- }
1503
- stack.push(chunk2TZKENDH_cjs.bigIntValue(bigIntPow(chunk7ZX6B7SY_cjs.toBigIntOperand(l), chunk7ZX6B7SY_cjs.toBigIntOperand(r))));
1504
- break;
1505
- }
1506
- }
1507
- stack.push(chunk2TZKENDH_cjs.numberValue(chunk7ZX6B7SY_cjs.power(l.toNumber(), r.toNumber())));
1508
- break;
1509
- }
1510
- case 26 /* NEG */: {
1511
- const v = safePop(stack);
1512
- const negFault = chunk2TZKENDH_cjs.faultedOperand(v);
1513
- if (negFault) {
1514
- stack.push(negFault);
1515
- break;
1516
- }
1517
- if (v.type === 2 /* BigInt */) stack.push(chunk2TZKENDH_cjs.bigIntValue(-v.value));
1518
- else if (v.type === 6 /* Uom */ && v.exact !== void 0) stack.push(chunk2TZKENDH_cjs.uomValueExact(-v.toNumber(), v.unit, chunkHIQ5HSZL_cjs.decimalNegate(v.exact)));
1519
- else if (v.type === 6 /* Uom */) stack.push(chunk2TZKENDH_cjs.uomValue(-v.toNumber(), v.unit));
1520
- else if (v.type === 5 /* Percentage */) stack.push(chunk2TZKENDH_cjs.percentageValue(-v.toNumber()));
1521
- else if (v.type === 9 /* Symbolic */) stack.push(chunk7ZX6B7SY_cjs.symbolicNeg(v));
1522
- else if (v.type === 0 /* Number */ && v.rational !== void 0) stack.push(chunk2TZKENDH_cjs.numberValueRational(-v.toNumber(), chunkHIQ5HSZL_cjs.rationalNeg(v.rational)));
1523
- else if (v.type === 0 /* Number */ && v.exact !== void 0) stack.push(chunk2TZKENDH_cjs.numberValueExact(-v.toNumber(), chunkHIQ5HSZL_cjs.decimalNegate(v.exact)));
1524
- else stack.push(chunk2TZKENDH_cjs.numberValue(-v.toNumber()));
1525
- break;
1526
- }
1527
- case 27 /* POS */: {
1528
- const v = safePop(stack);
1529
- const posFault = chunk2TZKENDH_cjs.faultedOperand(v);
1530
- if (posFault) {
1531
- stack.push(posFault);
1532
- break;
1533
- }
1534
- if (v.type === 6 /* Uom */ && v.exact !== void 0) stack.push(chunk2TZKENDH_cjs.uomValueExact(v.toNumber(), v.unit, v.exact));
1535
- else if (v.type === 6 /* Uom */) stack.push(chunk2TZKENDH_cjs.uomValue(v.toNumber(), v.unit));
1536
- else if (v.type === 5 /* Percentage */) stack.push(chunk2TZKENDH_cjs.percentageValue(v.toNumber()));
1537
- else if (v.type === 0 /* Number */ && v.rational !== void 0) stack.push(chunk2TZKENDH_cjs.numberValueRational(v.toNumber(), v.rational));
1538
- else if (v.type === 0 /* Number */ && v.exact !== void 0) stack.push(chunk2TZKENDH_cjs.numberValueExact(v.toNumber(), v.exact));
1539
- else stack.push(chunk2TZKENDH_cjs.numberValue(v.toNumber()));
1540
- break;
1541
- }
1542
- case 28 /* MAKE_UNCERTAIN */: {
1543
- const spread = safePop(stack), center = safePop(stack);
1544
- const uncFault = chunk2TZKENDH_cjs.faultedOperand(center, spread);
1545
- if (uncFault) {
1546
- stack.push(uncFault);
1547
- break;
1548
- }
1549
- stack.push(chunk2TZKENDH_cjs.numberValueUncertain(center.toNumber(), Math.abs(spread.toNumber())));
1550
- break;
1551
- }
1552
- // ═══════════════════════════════════════════════════════════════
1553
- // §4 Bitwise (OpCode 30–36)
1554
- // None of these routes through binaryOp(), so each one carries
1555
- // its own faulted-operand check for the reason that function
1556
- // documents: a bit pattern read off an Error or a Pending is the
1557
- // bit pattern of zero, and `(5 kg to m) & 1` answered 0 with
1558
- // nothing to say it had not been asked a real question.
1559
- // ═══════════════════════════════════════════════════════════════
1560
- case 30 /* LSHIFT */: {
1561
- const r = safePop(stack), l = safePop(stack);
1562
- const shiftFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1563
- if (shiftFault) {
1564
- stack.push(shiftFault);
1565
- break;
1566
- }
1567
- if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1568
- stack.push(bigIntShift(l, r, 1));
1569
- } else {
1570
- stack.push(chunk2TZKENDH_cjs.numberValue(l.toNumber() << r.toNumber()));
1571
- }
1572
- break;
1573
- }
1574
- case 31 /* RSHIFT */: {
1575
- const r = safePop(stack), l = safePop(stack);
1576
- const rshiftFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1577
- if (rshiftFault) {
1578
- stack.push(rshiftFault);
1579
- break;
1580
- }
1581
- if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1582
- stack.push(bigIntShift(l, r, -1));
1583
- } else {
1584
- stack.push(chunk2TZKENDH_cjs.numberValue(l.toNumber() >> r.toNumber()));
1585
- }
1586
- break;
1587
- }
1588
- case 32 /* URSHIFT */: {
1589
- const r = safePop(stack), l = safePop(stack);
1590
- const urshiftFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1591
- if (urshiftFault) {
1592
- stack.push(urshiftFault);
1593
- break;
1594
- }
1595
- stack.push(chunk2TZKENDH_cjs.numberValue(l.toNumber() >>> r.toNumber()));
1596
- break;
1597
- }
1598
- case 33 /* BIT_AND */: {
1599
- const r = safePop(stack), l = safePop(stack);
1600
- const andFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1601
- if (andFault) {
1602
- stack.push(andFault);
1603
- break;
1604
- }
1605
- if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1606
- stack.push(chunk2TZKENDH_cjs.bigIntValue(chunk7ZX6B7SY_cjs.toBigIntOperand(l) & chunk7ZX6B7SY_cjs.toBigIntOperand(r)));
1607
- } else {
1608
- stack.push(chunk2TZKENDH_cjs.numberValue(l.toNumber() & r.toNumber()));
1609
- }
1610
- break;
1611
- }
1612
- case 34 /* BIT_OR */: {
1613
- const r = safePop(stack), l = safePop(stack);
1614
- const orFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1615
- if (orFault) {
1616
- stack.push(orFault);
1617
- break;
1618
- }
1619
- if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1620
- stack.push(chunk2TZKENDH_cjs.bigIntValue(chunk7ZX6B7SY_cjs.toBigIntOperand(l) | chunk7ZX6B7SY_cjs.toBigIntOperand(r)));
1621
- } else {
1622
- stack.push(chunk2TZKENDH_cjs.numberValue(l.toNumber() | r.toNumber()));
1623
- }
1624
- break;
1625
- }
1626
- case 35 /* BIT_XOR */: {
1627
- const r = safePop(stack), l = safePop(stack);
1628
- const xorFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1629
- if (xorFault) {
1630
- stack.push(xorFault);
1631
- break;
1632
- }
1633
- if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1634
- stack.push(chunk2TZKENDH_cjs.bigIntValue(chunk7ZX6B7SY_cjs.toBigIntOperand(l) ^ chunk7ZX6B7SY_cjs.toBigIntOperand(r)));
1635
- } else {
1636
- stack.push(chunk2TZKENDH_cjs.numberValue(l.toNumber() ^ r.toNumber()));
1637
- }
1638
- break;
1639
- }
1640
- case 36 /* BIT_NOT */: {
1641
- const v = safePop(stack);
1642
- const notFault = chunk2TZKENDH_cjs.faultedOperand(v);
1643
- if (notFault) {
1644
- stack.push(notFault);
1645
- break;
1646
- }
1647
- if (v.type === 2 /* BigInt */) stack.push(chunk2TZKENDH_cjs.bigIntValue(~v.value));
1648
- else stack.push(chunk2TZKENDH_cjs.numberValue(~v.toNumber()));
1649
- break;
1650
- }
1651
- // ═══════════════════════════════════════════════════════════════
1652
- // §4b Comparison (OpCode 40–45)
1653
- // Numeric fast path when both operands are Number;
1654
- // all six unify UoM operands before comparing them.
1655
- //
1656
- // The four ordering opcodes used to skip that unification and
1657
- // compare the bare magnitudes, so `1 km > 500 m` answered false
1658
- // and `30 min < 1 hour` answered false as well. They now go
1659
- // through compareUom() like EQ/NEQ, which also means they agree
1660
- // with EQ about where the boundary between "less" and "equal"
1661
- // falls: `equal` there is a tolerance rather than `===`, so a
1662
- // pair EQ calls equal is one GT and LT both call false.
1663
- //
1664
- // Two units that share no measure cannot be ordered at all, so
1665
- // the four ordering opcodes answer with an error rather than a
1666
- // boolean. EQ and NEQ still answer with a boolean, because
1667
- // "a kilogram is not a metre" is a true statement about a pair
1668
- // that cannot be converted, whereas "a kilogram is less than a
1669
- // metre" is not a statement at all.
1670
- //
1671
- // A faulted operand is the second case even for EQ and NEQ, and
1672
- // all six propagate it. A kilogram is a quantity that is not a
1673
- // metre; an Error is not a quantity, so there is nothing for it
1674
- // to be equal to. Reading its number gave zero, which made
1675
- // `(5 kg to m) == 0` answer true.
1676
- // ═══════════════════════════════════════════════════════════════
1677
- case 40 /* EQ */: {
1678
- const r = safePop(stack), l = safePop(stack);
1679
- const eqFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1680
- if (eqFault) {
1681
- stack.push(eqFault);
1682
- break;
1683
- }
1684
- if (l.rational !== void 0 || r.rational !== void 0) {
1685
- const cmp = chunk7ZX6B7SY_cjs.compareRationalOperands(l, r);
1686
- if (cmp !== null) {
1687
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp === 0));
1688
- break;
1689
- }
1690
- }
1691
- if (l.type === 0 /* Number */ && r.type === 0 /* Number */) {
1692
- stack.push(chunk2TZKENDH_cjs.boolValue(l.value === r.value));
1693
- } else if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1694
- const cmp = chunk7ZX6B7SY_cjs.compareBigIntOperands(l, r);
1695
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp === null ? l.toNumber() === r.toNumber() : cmp === 0));
1696
- } else if (l.type === 3 /* String */ && r.type === 3 /* String */) {
1697
- stack.push(chunk2TZKENDH_cjs.boolValue(l.value === r.value));
1698
- } else if (l.type === 6 /* Uom */ && r.type === 6 /* Uom */) {
1699
- const { equal, sameMeasure } = chunk7ZX6B7SY_cjs.compareUom(l, r);
1700
- stack.push(chunk2TZKENDH_cjs.boolValue(sameMeasure && equal));
1701
- } else if (l.type === 7 /* Matrix */ && r.type === 7 /* Matrix */) {
1702
- stack.push(chunkHIQ5HSZL_cjs.matrixCompare(l.value, r.value, (a, b) => a === b));
1703
- } else if (l.type === 14 /* Colour */ || r.type === 14 /* Colour */) {
1704
- if (l.type === 14 /* Colour */ && r.type === 14 /* Colour */) {
1705
- const a = l.value, b = r.value;
1706
- stack.push(chunk2TZKENDH_cjs.boolValue(a.r === b.r && a.g === b.g && a.b === b.b && a.a === b.a));
1707
- } else {
1708
- stack.push(chunk2TZKENDH_cjs.boolValue(false));
1709
- }
1710
- } else {
1711
- stack.push(chunk2TZKENDH_cjs.boolValue(l.toNumber() === r.toNumber()));
1712
- }
1713
- break;
1714
- }
1715
- case 41 /* NEQ */: {
1716
- const r = safePop(stack), l = safePop(stack);
1717
- const neqFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1718
- if (neqFault) {
1719
- stack.push(neqFault);
1720
- break;
1721
- }
1722
- if (l.rational !== void 0 || r.rational !== void 0) {
1723
- const cmp = chunk7ZX6B7SY_cjs.compareRationalOperands(l, r);
1724
- if (cmp !== null) {
1725
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp !== 0));
1726
- break;
1727
- }
1728
- }
1729
- if (l.type === 0 /* Number */ && r.type === 0 /* Number */) {
1730
- stack.push(chunk2TZKENDH_cjs.boolValue(l.value !== r.value));
1731
- } else if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1732
- const cmp = chunk7ZX6B7SY_cjs.compareBigIntOperands(l, r);
1733
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp === null ? l.toNumber() !== r.toNumber() : cmp !== 0));
1734
- } else if (l.type === 3 /* String */ && r.type === 3 /* String */) {
1735
- stack.push(chunk2TZKENDH_cjs.boolValue(l.value !== r.value));
1736
- } else if (l.type === 6 /* Uom */ && r.type === 6 /* Uom */) {
1737
- const { equal, sameMeasure } = chunk7ZX6B7SY_cjs.compareUom(l, r);
1738
- stack.push(chunk2TZKENDH_cjs.boolValue(!sameMeasure || !equal));
1739
- } else if (l.type === 7 /* Matrix */ && r.type === 7 /* Matrix */) {
1740
- stack.push(chunkHIQ5HSZL_cjs.matrixCompare(l.value, r.value, (a, b) => a !== b));
1741
- } else if (l.type === 14 /* Colour */ || r.type === 14 /* Colour */) {
1742
- if (l.type === 14 /* Colour */ && r.type === 14 /* Colour */) {
1743
- const a = l.value, b = r.value;
1744
- stack.push(chunk2TZKENDH_cjs.boolValue(!(a.r === b.r && a.g === b.g && a.b === b.b && a.a === b.a)));
1745
- } else {
1746
- stack.push(chunk2TZKENDH_cjs.boolValue(true));
1747
- }
1748
- } else {
1749
- stack.push(chunk2TZKENDH_cjs.boolValue(l.toNumber() !== r.toNumber()));
1750
- }
1751
- break;
1752
- }
1753
- case 42 /* LT */: {
1754
- const r = safePop(stack), l = safePop(stack);
1755
- const ltFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1756
- if (ltFault) {
1757
- stack.push(ltFault);
1758
- break;
1759
- }
1760
- if (l.rational !== void 0 || r.rational !== void 0) {
1761
- const cmp = chunk7ZX6B7SY_cjs.compareRationalOperands(l, r);
1762
- if (cmp !== null) {
1763
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp < 0));
1764
- break;
1765
- }
1766
- }
1767
- if (l.type === 0 /* Number */ && r.type === 0 /* Number */) {
1768
- stack.push(chunk2TZKENDH_cjs.boolValue(l.value < r.value));
1769
- } else if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1770
- const cmp = chunk7ZX6B7SY_cjs.compareBigIntOperands(l, r);
1771
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp === null ? l.toNumber() < r.toNumber() : cmp < 0));
1772
- } else if (l.type === 6 /* Uom */ && r.type === 6 /* Uom */) {
1773
- const { lv, rv, equal, sameMeasure } = chunk7ZX6B7SY_cjs.compareUom(l, r);
1774
- stack.push(sameMeasure ? chunk2TZKENDH_cjs.boolValue(!equal && lv < rv) : chunk7ZX6B7SY_cjs.incomparableUnitsError(l, r));
1775
- } else if (l.type === 7 /* Matrix */ && r.type === 7 /* Matrix */) {
1776
- stack.push(chunkHIQ5HSZL_cjs.matrixCompare(l.value, r.value, (a, b) => a < b));
1777
- } else {
1778
- stack.push(chunk2TZKENDH_cjs.boolValue(l.toNumber() < r.toNumber()));
1779
- }
1780
- break;
1781
- }
1782
- case 43 /* LTE */: {
1783
- const r = safePop(stack), l = safePop(stack);
1784
- const lteFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1785
- if (lteFault) {
1786
- stack.push(lteFault);
1787
- break;
1788
- }
1789
- if (l.rational !== void 0 || r.rational !== void 0) {
1790
- const cmp = chunk7ZX6B7SY_cjs.compareRationalOperands(l, r);
1791
- if (cmp !== null) {
1792
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp <= 0));
1793
- break;
1794
- }
1795
- }
1796
- if (l.type === 0 /* Number */ && r.type === 0 /* Number */) {
1797
- stack.push(chunk2TZKENDH_cjs.boolValue(l.value <= r.value));
1798
- } else if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1799
- const cmp = chunk7ZX6B7SY_cjs.compareBigIntOperands(l, r);
1800
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp === null ? l.toNumber() <= r.toNumber() : cmp <= 0));
1801
- } else if (l.type === 6 /* Uom */ && r.type === 6 /* Uom */) {
1802
- const { lv, rv, equal, sameMeasure } = chunk7ZX6B7SY_cjs.compareUom(l, r);
1803
- stack.push(sameMeasure ? chunk2TZKENDH_cjs.boolValue(equal || lv <= rv) : chunk7ZX6B7SY_cjs.incomparableUnitsError(l, r));
1804
- } else if (l.type === 7 /* Matrix */ && r.type === 7 /* Matrix */) {
1805
- stack.push(chunkHIQ5HSZL_cjs.matrixCompare(l.value, r.value, (a, b) => a <= b));
1806
- } else {
1807
- stack.push(chunk2TZKENDH_cjs.boolValue(l.toNumber() <= r.toNumber()));
1808
- }
1809
- break;
1810
- }
1811
- case 44 /* GT */: {
1812
- const r = safePop(stack), l = safePop(stack);
1813
- const gtFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1814
- if (gtFault) {
1815
- stack.push(gtFault);
1816
- break;
1817
- }
1818
- if (l.rational !== void 0 || r.rational !== void 0) {
1819
- const cmp = chunk7ZX6B7SY_cjs.compareRationalOperands(l, r);
1820
- if (cmp !== null) {
1821
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp > 0));
1822
- break;
1823
- }
1824
- }
1825
- if (l.type === 0 /* Number */ && r.type === 0 /* Number */) {
1826
- stack.push(chunk2TZKENDH_cjs.boolValue(l.value > r.value));
1827
- } else if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1828
- const cmp = chunk7ZX6B7SY_cjs.compareBigIntOperands(l, r);
1829
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp === null ? l.toNumber() > r.toNumber() : cmp > 0));
1830
- } else if (l.type === 6 /* Uom */ && r.type === 6 /* Uom */) {
1831
- const { lv, rv, equal, sameMeasure } = chunk7ZX6B7SY_cjs.compareUom(l, r);
1832
- stack.push(sameMeasure ? chunk2TZKENDH_cjs.boolValue(!equal && lv > rv) : chunk7ZX6B7SY_cjs.incomparableUnitsError(l, r));
1833
- } else if (l.type === 7 /* Matrix */ && r.type === 7 /* Matrix */) {
1834
- stack.push(chunkHIQ5HSZL_cjs.matrixCompare(l.value, r.value, (a, b) => a > b));
1835
- } else {
1836
- stack.push(chunk2TZKENDH_cjs.boolValue(l.toNumber() > r.toNumber()));
1837
- }
1838
- break;
1839
- }
1840
- case 45 /* GTE */: {
1841
- const r = safePop(stack), l = safePop(stack);
1842
- const gteFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1843
- if (gteFault) {
1844
- stack.push(gteFault);
1845
- break;
1846
- }
1847
- if (l.rational !== void 0 || r.rational !== void 0) {
1848
- const cmp = chunk7ZX6B7SY_cjs.compareRationalOperands(l, r);
1849
- if (cmp !== null) {
1850
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp >= 0));
1851
- break;
1852
- }
1853
- }
1854
- if (l.type === 0 /* Number */ && r.type === 0 /* Number */) {
1855
- stack.push(chunk2TZKENDH_cjs.boolValue(l.value >= r.value));
1856
- } else if (l.type === 2 /* BigInt */ || r.type === 2 /* BigInt */) {
1857
- const cmp = chunk7ZX6B7SY_cjs.compareBigIntOperands(l, r);
1858
- stack.push(chunk2TZKENDH_cjs.boolValue(cmp === null ? l.toNumber() >= r.toNumber() : cmp >= 0));
1859
- } else if (l.type === 6 /* Uom */ && r.type === 6 /* Uom */) {
1860
- const { lv, rv, equal, sameMeasure } = chunk7ZX6B7SY_cjs.compareUom(l, r);
1861
- stack.push(sameMeasure ? chunk2TZKENDH_cjs.boolValue(equal || lv >= rv) : chunk7ZX6B7SY_cjs.incomparableUnitsError(l, r));
1862
- } else if (l.type === 7 /* Matrix */ && r.type === 7 /* Matrix */) {
1863
- stack.push(chunkHIQ5HSZL_cjs.matrixCompare(l.value, r.value, (a, b) => a >= b));
1864
- } else {
1865
- stack.push(chunk2TZKENDH_cjs.boolValue(l.toNumber() >= r.toNumber()));
1866
- }
1867
- break;
1868
- }
1869
- // ═══════════════════════════════════════════════════════════════
1870
- // §4c Logical / conditional select (OpCode 130–132)
1871
- //
1872
- // Truthiness is read through isTruthy(), which reads a number,
1873
- // which is zero for a fault, so a failed operand used to be
1874
- // quietly false. Both operands are already evaluated by the time
1875
- // either opcode runs (this VM has no branch opcodes), so there is
1876
- // no short-circuit to preserve by ignoring the right-hand one.
1877
- // ═══════════════════════════════════════════════════════════════
1878
- case 130 /* LOGICAL_AND */: {
1879
- const r = safePop(stack), l = safePop(stack);
1880
- const andLogicFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1881
- if (andLogicFault) {
1882
- stack.push(andLogicFault);
1883
- break;
1884
- }
1885
- stack.push(chunk2TZKENDH_cjs.boolValue(isTruthy(l) && isTruthy(r)));
1886
- break;
1887
- }
1888
- case 131 /* LOGICAL_OR */: {
1889
- const r = safePop(stack), l = safePop(stack);
1890
- const orLogicFault = chunk2TZKENDH_cjs.faultedOperand(l, r);
1891
- if (orLogicFault) {
1892
- stack.push(orLogicFault);
1893
- break;
1894
- }
1895
- stack.push(chunk2TZKENDH_cjs.boolValue(isTruthy(l) || isTruthy(r)));
1896
- break;
1897
- }
1898
- case 132 /* SELECT */: {
1899
- const elseVal = safePop(stack);
1900
- const thenVal = safePop(stack);
1901
- const condition = safePop(stack);
1902
- const conditionFault = chunk2TZKENDH_cjs.faultedOperand(condition);
1903
- if (conditionFault) {
1904
- stack.push(conditionFault);
1905
- break;
1906
- }
1907
- stack.push(isTruthy(condition) ? thenVal : elseVal);
1908
- break;
1909
- }
1910
- // ═══════════════════════════════════════════════════════════════
1911
- // §5 Functions (OpCode 50–52)
1912
- // ═══════════════════════════════════════════════════════════════
1913
- case 50 /* CALL_PLUGIN */: {
1914
- const fnIdx = operandByte(opcodes, ip++, op, "plugin-function index");
1915
- const argCount = operandByte(opcodes, ip++, op, "argument count");
1916
- const args = [];
1917
- for (let i = 0; i < argCount; i++) args.push(safePop(stack));
1918
- args.reverse();
1919
- const fn = vm.context.pluginFunctions[fnIdx];
1920
- const pluginArgFault = chunk2TZKENDH_cjs.faultedIn(args);
1921
- if (pluginArgFault) {
1922
- stack.push(pluginArgFault);
1923
- } else if (!fn) {
1924
- stack.push(chunk2TZKENDH_cjs.numberValue(0));
1925
- } else {
1926
- const result = fn(args, context);
1927
- if (result instanceof Promise) {
1928
- const cacheKey = `plugin:${fnIdx}:${args.map((a) => String(a.value ?? "")).join("|")}`;
1929
- const signal = vm.activeSignal;
1930
- const packageId = vm.context.pluginFunctionOwners[fnIdx] ?? "";
1931
- return { type: "pending", queryKey: cacheKey, resolver: result, packageId, signal };
1932
- }
1933
- stack.push(result);
1934
- }
1935
- break;
1936
- }
1937
- case 51 /* CALL_BUILTIN */: {
1938
- const fnIdx = operandByte(opcodes, ip++, op, "builtin-function index");
1939
- const argCount = operandByte(opcodes, ip++, op, "argument count");
1940
- const arityError = builtinArityError(fnIdx, argCount);
1941
- if (arityError) throw arityError;
1942
- const args = [];
1943
- let sawSymbolic = false;
1944
- for (let i = 0; i < argCount; i++) {
1945
- const arg = safePop(stack);
1946
- if (arg.type === 9 /* Symbolic */) sawSymbolic = true;
1947
- args.push(arg);
1948
- }
1949
- const builtinArgFault = chunk2TZKENDH_cjs.faultedIn(args);
1950
- if (builtinArgFault) {
1951
- stack.push(builtinArgFault);
1952
- break;
1953
- }
1954
- const fn = chunk7ZX6B7SY_cjs.builtinFunctions[fnIdx];
1955
- if (fn) {
1956
- const ordered = args.reverse();
1957
- const routeSymbolically = sawSymbolic && !chunk7ZX6B7SY_cjs.SYMBOLIC_NATIVE_BUILTINS.has(fnIdx);
1958
- stack.push(routeSymbolically ? chunk7ZX6B7SY_cjs.symbolicBuiltin(fnIdx, ordered) : fn(ordered));
1959
- }
1960
- break;
1961
- }
1962
- case 150 /* DEFINE_USER_FUNCTION */: {
1963
- const bodyIdx = operandByte(opcodes, ip++, op, "function-body index");
1964
- const def = userFunctionBodies?.[bodyIdx];
1965
- if (!def) {
1966
- throw chunkB4HBEFTB_cjs.ErrorFactory.internal(
1967
- "INTERNAL_MISSING_FUNCTION_BODY",
1968
- `Internal error: DEFINE_USER_FUNCTION referenced missing body index ${bodyIdx}`,
1969
- { bodyIdx }
1970
- );
1971
- }
1972
- vm.defineUserFunction(def.name, def.params, def.program);
1973
- break;
1974
- }
1975
- case 151 /* CALL_USER_FUNCTION */: {
1976
- const name = poolString(opcodes, ip++, strings, op, "function-name index");
1977
- const argCount = operandByte(opcodes, ip++, op, "argument count");
1978
- const args = [];
1979
- for (let i = 0; i < argCount; i++) args.push(safePop(stack));
1980
- args.reverse();
1981
- const fn = vm.getUserFunction(name);
1982
- if (!fn) {
1983
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution("UNDEFINED_FUNCTION", `Undefined function: ${name}`, { name });
1984
- }
1985
- if (argCount !== fn.params.length) {
1986
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution(
1987
- "FUNCTION_ARITY_MISMATCH",
1988
- `${name} expects ${fn.params.length} argument(s) but got ${argCount}`,
1989
- { name, expected: fn.params.length, actual: argCount }
1990
- );
1991
- }
1992
- const frame = /* @__PURE__ */ new Map();
1993
- for (let i = 0; i < fn.params.length; i++) frame.set(fn.params[i], args[i]);
1994
- chunk2TZKENDH_cjs.chargeFunctionCall();
1995
- vm.pushCallFrame(frame);
1996
- let bodyResult;
1997
- try {
1998
- bodyResult = executeBytecode(fn.program, vm, pipeline, expression, context);
1999
- } finally {
2000
- vm.popCallFrame();
2001
- }
2002
- if (bodyResult.type === "pending") {
2003
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution(
2004
- "USER_FUNCTION_ASYNC_UNSUPPORTED",
2005
- `${name}: user-defined functions with async bodies (weather, stocks, currency, ...) aren't supported`,
2006
- { name }
2007
- );
2008
- }
2009
- if (bodyResult.type === "error") {
2010
- throw bodyResult.error;
2011
- }
2012
- stack.push(bodyResult.value);
2013
- break;
2014
- }
2015
- // ═══════════════════════════════════════════════════════════════
2016
- // §6 Variables (OpCode 60–63)
2017
- // ═══════════════════════════════════════════════════════════════
2018
- case 60 /* LOAD_VAR */: {
2019
- const varName = poolString(opcodes, ip++, strings, op, "variable-name index");
2020
- const val = vm.getVar(varName);
2021
- if (val !== void 0) {
2022
- stack.push(val);
2023
- } else if (symbolicTolerant) {
2024
- stack.push(chunk2TZKENDH_cjs.symbolicValue(chunkHIQ5HSZL_cjs.varNode(varName)));
2025
- } else {
2026
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution(
2027
- "UNDEFINED_VARIABLE",
2028
- `Undefined variable: ${varName}`,
2029
- { varName }
2030
- );
2031
- }
2032
- break;
2033
- }
2034
- case 61 /* STORE_VAR */: {
2035
- const val = safePop(stack);
2036
- const varName = poolString(opcodes, ip++, strings, op, "variable-name index");
2037
- vm.setVar(varName, hasArena ? chunk2TZKENDH_cjs.persistentValue(val) : val);
2038
- stack.push(val);
2039
- break;
2040
- }
2041
- case 62 /* LOAD_GLOBAL_VAR */: {
2042
- const varName = poolString(opcodes, ip++, strings, op, "variable-name index");
2043
- const globalValue = chunk7ZX6B7SY_cjs.sharedGlobalVariableStore.get(varName);
2044
- if (globalValue === void 0) {
2045
- throw chunkB4HBEFTB_cjs.ErrorFactory.internal({
2046
- code: "GLOBAL_VARIABLE_NOT_RESOLVED",
2047
- message: `Global variable "${varName}" was read before it resolved`,
2048
- expected: `global variable "${varName}" to already be resolved (async preflight should guarantee this)`,
2049
- found: "no value in the global variable store",
2050
- context: { varName }
2051
- });
2052
- }
2053
- stack.push(globalValue);
2054
- break;
2055
- }
2056
- case 63 /* STORE_GLOBAL_VAR */: {
2057
- const val = safePop(stack);
2058
- const varName = poolString(opcodes, ip++, strings, op, "variable-name index");
2059
- chunk7ZX6B7SY_cjs.sharedGlobalVariableStore.set(varName, hasArena ? chunk2TZKENDH_cjs.persistentValue(val) : val);
2060
- stack.push(val);
2061
- break;
2062
- }
2063
- // ═══════════════════════════════════════════════════════════════
2064
- // §7 Type conversions (OpCode 70–74, 140–145)
2065
- // Every one of these restates a number in another notation, so a
2066
- // faulted operand has nothing to restate and each propagates it
2067
- // rather than converting the zero toNumber() reports. Without it
2068
- // "(5 kg to m) as hex" answered 0x0 and "as binary" answered 0b0.
2069
- // ═══════════════════════════════════════════════════════════════
2070
- case 70 /* TO_NUMBER */: {
2071
- const v = safePop(stack);
2072
- const toNumberFault = chunk2TZKENDH_cjs.faultedOperand(v);
2073
- if (toNumberFault) {
2074
- stack.push(toNumberFault);
2075
- break;
2076
- }
2077
- stack.push(chunk2TZKENDH_cjs.numberValue(v.toNumber()));
2078
- break;
2079
- }
2080
- case 71 /* TO_HEX */: {
2081
- const v = safePop(stack);
2082
- const toHexFault = chunk2TZKENDH_cjs.faultedOperand(v);
2083
- if (toHexFault) {
2084
- stack.push(toHexFault);
2085
- break;
2086
- }
2087
- if (v.type === 14 /* Colour */) {
2088
- const c = v.value;
2089
- stack.push(chunk2TZKENDH_cjs.colourValue({ r: c.r, g: c.g, b: c.b, a: c.a, format: "hex" }));
2090
- break;
2091
- }
2092
- stack.push(chunk2TZKENDH_cjs.hexValue(v.type === 2 /* BigInt */ ? v.value : v.toNumber()));
2093
- break;
2094
- }
2095
- case 74 /* TO_PERCENTAGE */: {
2096
- const v = safePop(stack);
2097
- const toPercentageFault = chunk2TZKENDH_cjs.faultedOperand(v);
2098
- if (toPercentageFault) {
2099
- stack.push(toPercentageFault);
2100
- break;
2101
- }
2102
- stack.push(chunk2TZKENDH_cjs.percentageValue(v.toNumber()));
2103
- break;
2104
- }
2105
- case 140 /* TO_FRACTION */: {
2106
- const v = safePop(stack);
2107
- const toFractionFault = chunk2TZKENDH_cjs.faultedOperand(v);
2108
- if (toFractionFault) {
2109
- stack.push(toFractionFault);
2110
- break;
2111
- }
2112
- stack.push(chunk2TZKENDH_cjs.stringValue(v.rational !== void 0 ? rationalToFractionString(v.rational) : toFractionString(v.toNumber())));
2113
- break;
2114
- }
2115
- case 141 /* TO_MULTIPLIER */: {
2116
- const v = safePop(stack);
2117
- const toMultiplierFault = chunk2TZKENDH_cjs.faultedOperand(v);
2118
- if (toMultiplierFault) {
2119
- stack.push(toMultiplierFault);
2120
- break;
2121
- }
2122
- stack.push(chunk2TZKENDH_cjs.stringValue(toMultiplierString(v)));
2123
- break;
2124
- }
2125
- case 142 /* TO_SCI */: {
2126
- const v = safePop(stack);
2127
- const toSciFault = chunk2TZKENDH_cjs.faultedOperand(v);
2128
- if (toSciFault) {
2129
- stack.push(toSciFault);
2130
- break;
2131
- }
2132
- stack.push(chunk2TZKENDH_cjs.stringValue(toScientificString(v.toNumber())));
2133
- break;
2134
- }
2135
- // Numeric, like TO_HEX above. A base is a way of writing a number, so
2136
- // `(255 as binary) + 1` has to be 256; as a string it was 1.
2137
- case 143 /* TO_BINARY */: {
2138
- const v = safePop(stack);
2139
- const toBinaryFault = chunk2TZKENDH_cjs.faultedOperand(v);
2140
- if (toBinaryFault) {
2141
- stack.push(toBinaryFault);
2142
- break;
2143
- }
2144
- stack.push(chunk2TZKENDH_cjs.hexValue(v.type === 2 /* BigInt */ ? v.value : v.toNumber(), "bin"));
2145
- break;
2146
- }
2147
- case 144 /* TO_OCTAL */: {
2148
- const v = safePop(stack);
2149
- const toOctalFault = chunk2TZKENDH_cjs.faultedOperand(v);
2150
- if (toOctalFault) {
2151
- stack.push(toOctalFault);
2152
- break;
2153
- }
2154
- stack.push(chunk2TZKENDH_cjs.hexValue(v.type === 2 /* BigInt */ ? v.value : v.toNumber(), "oct"));
2155
- break;
2156
- }
2157
- case 145 /* CALL_AS_CONVERTER */: {
2158
- const name = stringOperand(safePop(stack), op, "converter name").toLowerCase();
2159
- const value = safePop(stack);
2160
- const converterFault = chunk2TZKENDH_cjs.faultedOperand(value);
2161
- if (converterFault) {
2162
- stack.push(converterFault);
2163
- break;
2164
- }
2165
- const converter = chunk7ZX6B7SY_cjs.asConverterRegistry.get(name);
2166
- if (!converter) {
2167
- stack.push(chunk2TZKENDH_cjs.errorValue("UNKNOWN_AS_CONVERTER", `Unknown converter "as ${name}"`));
2168
- } else {
2169
- stack.push(converter(value));
2170
- }
2171
- break;
2172
- }
2173
- // ═══════════════════════════════════════════════════════════════
2174
- // §8 UoM (OpCode 80–84)
2175
- // ═══════════════════════════════════════════════════════════════
2176
- case 80 /* UOM_CONVERT */: {
2177
- const unit = stringOperand(safePop(stack), op, "unit name");
2178
- const operand = safePop(stack);
2179
- const faulted = chunk2TZKENDH_cjs.faultedOperand(operand);
2180
- if (faulted) {
2181
- stack.push(faulted);
2182
- break;
2183
- }
2184
- const money = chunk7ZX6B7SY_cjs.moneyExactMagnitude(operand, unit);
2185
- if (money) stack.push(chunk2TZKENDH_cjs.uomValueExact(operand.toNumber(), unit, money));
2186
- else stack.push(chunk2TZKENDH_cjs.uomValue(operand.toNumber(), unit));
2187
- break;
2188
- }
2189
- case 81 /* UOM_CONVERT_TO */: {
2190
- const toUnit = stringOperand(safePop(stack), op, "target unit name");
2191
- const fromUnit = stringOperand(safePop(stack), op, "source unit name");
2192
- const operand = safePop(stack);
2193
- const faulted = chunk2TZKENDH_cjs.faultedOperand(operand);
2194
- if (faulted) {
2195
- stack.push(faulted);
2196
- break;
2197
- }
2198
- const val = operand.toNumber();
2199
- const measure = chunkEJ3ILXX6_cjs.getMeasure(fromUnit);
2200
- const isCurrency = chunkZVTWQLK4_cjs.sharedCurrencyExchange.isCurrency(fromUnit) && chunkZVTWQLK4_cjs.sharedCurrencyExchange.isCurrency(toUnit);
2201
- if (measure && chunkEJ3ILXX6_cjs.getMeasure(toUnit) === measure) {
2202
- stack.push(chunk2TZKENDH_cjs.uomValue(chunkEJ3ILXX6_cjs.convertUnit(val, fromUnit, toUnit), toUnit));
2203
- } else if (isCurrency) {
2204
- const converted = chunkZVTWQLK4_cjs.sharedCurrencyExchange.convertSync(val, fromUnit, toUnit);
2205
- if (converted !== null) {
2206
- stack.push(chunk2TZKENDH_cjs.uomValue(converted, toUnit));
2207
- } else {
2208
- stack.push(chunk2TZKENDH_cjs.errorValue("CURRENCY_RATE_UNAVAILABLE", `No exchange rate available for ${fromUnit} to ${toUnit}`));
2209
- }
2210
- } else {
2211
- const rate = chunkEJ3ILXX6_cjs.convertRate(val, fromUnit, toUnit);
2212
- if (rate !== null) {
2213
- stack.push(chunk2TZKENDH_cjs.uomValue(rate, toUnit));
2214
- } else {
2215
- stack.push(incompatibleConversionError(fromUnit, toUnit));
2216
- }
2217
- }
2218
- break;
2219
- }
2220
- case 85 /* UOM_POSSIBILITIES */: {
2221
- const unit = stringOperand(safePop(stack), op, "unit name");
2222
- const possibilities = chunkEJ3ILXX6_cjs.getConvertiblePossibilities(unit);
2223
- stack.push(chunk2TZKENDH_cjs.stringValue(possibilities.length > 0 ? possibilities.join(", ") : `No known units for "${unit}"`));
2224
- break;
2225
- }
2226
- case 83 /* UOM_BEST */: {
2227
- const unit = stringOperand(safePop(stack), op, "unit name");
2228
- const operand = safePop(stack);
2229
- const faulted = chunk2TZKENDH_cjs.faultedOperand(operand);
2230
- if (faulted) {
2231
- stack.push(faulted);
2232
- break;
2233
- }
2234
- const { value, unit: bestUnit } = chunkEJ3ILXX6_cjs.getBestUnit(operand.toNumber(), unit);
2235
- stack.push(chunk2TZKENDH_cjs.uomValue(value, bestUnit));
2236
- break;
2237
- }
2238
- case 84 /* UOM_CONVERT_IN */: {
2239
- const toUnit = stringOperand(safePop(stack), op, "target unit name");
2240
- const left = safePop(stack);
2241
- const faulted = chunk2TZKENDH_cjs.faultedOperand(left);
2242
- if (faulted) {
2243
- stack.push(faulted);
2244
- break;
2245
- }
2246
- if (left.type === 6 /* Uom */) {
2247
- const fromUnit = left.unit;
2248
- const val = left.toNumber();
2249
- const measure = chunkEJ3ILXX6_cjs.getMeasure(fromUnit);
2250
- const isCurrency = chunkZVTWQLK4_cjs.sharedCurrencyExchange.isCurrency(fromUnit) && chunkZVTWQLK4_cjs.sharedCurrencyExchange.isCurrency(toUnit);
2251
- if (measure && chunkEJ3ILXX6_cjs.getMeasure(toUnit) === measure) {
2252
- stack.push(chunk2TZKENDH_cjs.uomValue(chunkEJ3ILXX6_cjs.convertUnit(val, fromUnit, toUnit), toUnit));
2253
- } else if (isCurrency) {
2254
- const converted = chunkZVTWQLK4_cjs.sharedCurrencyExchange.convertSync(val, fromUnit, toUnit);
2255
- if (converted !== null) {
2256
- stack.push(chunk2TZKENDH_cjs.uomValue(converted, toUnit));
2257
- } else {
2258
- stack.push(chunk2TZKENDH_cjs.errorValue("CURRENCY_RATE_UNAVAILABLE", `No exchange rate available for ${fromUnit} to ${toUnit}`));
2259
- }
2260
- } else {
2261
- const rate = chunkEJ3ILXX6_cjs.convertRate(val, fromUnit, toUnit);
2262
- if (rate !== null) {
2263
- stack.push(chunk2TZKENDH_cjs.uomValue(rate, toUnit));
2264
- } else {
2265
- stack.push(incompatibleConversionError(fromUnit, toUnit));
2266
- }
2267
- }
2268
- } else {
2269
- stack.push(chunk2TZKENDH_cjs.uomValue(left.toNumber(), toUnit));
2270
- }
2271
- break;
2272
- }
2273
- case 82 /* UOM_GET_VALUE */: {
2274
- const v = safePop(stack);
2275
- const getValueFault = chunk2TZKENDH_cjs.faultedOperand(v);
2276
- if (getValueFault) {
2277
- stack.push(getValueFault);
2278
- break;
2279
- }
2280
- stack.push(chunk2TZKENDH_cjs.numberValue(v.toNumber()));
2281
- break;
2282
- }
2283
- // ═══════════════════════════════════════════════════════════════
2284
- // §8.5 Rate, "quantity per unit of something" (OpCode 110–112)
2285
- // See vm/Value.ts's rateValue()/isRateUnit()/splitRateUnit().
2286
- // ═══════════════════════════════════════════════════════════════
2287
- case 110 /* RATE_DIV */: {
2288
- const denominatorVal = safePop(stack);
2289
- const numeratorVal = safePop(stack);
2290
- const rateDivFault = chunk2TZKENDH_cjs.faultedOperand(numeratorVal, denominatorVal);
2291
- if (rateDivFault) {
2292
- stack.push(rateDivFault);
2293
- break;
2294
- }
2295
- if (denominatorVal.type !== 6 /* Uom */ || !denominatorVal.unit) {
2296
- stack.push(chunk2TZKENDH_cjs.errorValue("RATE_MISSING_DENOMINATOR_UNIT", 'Cannot build a rate: the right-hand side of "/" has no unit'));
2297
- break;
2298
- }
2299
- const numeratorUnit = numeratorVal.type === 6 /* Uom */ ? numeratorVal.unit ?? "" : "";
2300
- stack.push(chunk2TZKENDH_cjs.rateValue(numeratorVal.toNumber() / denominatorVal.toNumber(), numeratorUnit, denominatorVal.unit));
2301
- break;
2302
- }
2303
- case 111 /* RATE_MUL */: {
2304
- const multiplier = safePop(stack);
2305
- const rate = safePop(stack);
2306
- const rateMulFault = chunk2TZKENDH_cjs.faultedOperand(rate, multiplier);
2307
- if (rateMulFault) {
2308
- stack.push(rateMulFault);
2309
- break;
2310
- }
2311
- if (rate.type !== 6 /* Uom */ || !chunk2TZKENDH_cjs.isRateUnit(rate.unit)) {
2312
- stack.push(chunk2TZKENDH_cjs.errorValue("RATE_MUL_LEFT_NOT_A_RATE", 'Left-hand side of a rate multiplication must be a rate (e.g. "$50/week")'));
2313
- break;
2314
- }
2315
- if (multiplier.type !== 6 /* Uom */ || !multiplier.unit) {
2316
- stack.push(chunk2TZKENDH_cjs.errorValue("RATE_MUL_RIGHT_MISSING_UNIT", "Right-hand side of a rate multiplication must have a unit matching the rate's denominator"));
2317
- break;
2318
- }
2319
- stack.push(multiplyRateByMatchingUom(rate, multiplier));
2320
- break;
2321
- }
2322
- case 112 /* RATE_CONVERT */: {
2323
- const newDenominatorUnit = stringOperand(safePop(stack), op, "denominator unit name");
2324
- const rate = safePop(stack);
2325
- const rateConvertFault = chunk2TZKENDH_cjs.faultedOperand(rate);
2326
- if (rateConvertFault) {
2327
- stack.push(rateConvertFault);
2328
- break;
2329
- }
2330
- if (rate.type !== 6 /* Uom */ || !chunk2TZKENDH_cjs.isRateUnit(rate.unit)) {
2331
- stack.push(chunk2TZKENDH_cjs.errorValue("RATE_CONVERT_NOT_A_RATE", "Cannot convert a non-rate value's denominator"));
2332
- break;
2333
- }
2334
- const { numerator, denominator } = chunk2TZKENDH_cjs.splitRateUnit(rate.unit);
2335
- const rateMeasure = chunkEJ3ILXX6_cjs.getMeasure(denominator);
2336
- const targetMeasure = chunkEJ3ILXX6_cjs.getMeasure(newDenominatorUnit);
2337
- if (!rateMeasure || rateMeasure !== targetMeasure) {
2338
- stack.push(chunk2TZKENDH_cjs.errorValue(
2339
- "RATE_CONVERT_MEASURE_MISMATCH",
2340
- `Cannot convert a "${denominator}"-denominated rate to "${newDenominatorUnit}" \u2014 different measures`
2341
- ));
2342
- break;
2343
- }
2344
- const factor = chunkEJ3ILXX6_cjs.convertUnit(1, newDenominatorUnit, denominator);
2345
- stack.push(chunk2TZKENDH_cjs.rateValue(rate.toNumber() * factor, numerator, newDenominatorUnit));
2346
- break;
2347
- }
2348
- // ═══════════════════════════════════════════════════════════════
2349
- // §8.7 Time, clock-time-of-day (OpCode 120)
2350
- // ═══════════════════════════════════════════════════════════════
2351
- case 120 /* CLOCK_TIME_TODAY */: {
2352
- const minutesValue = safePop(stack);
2353
- const clockFault = chunk2TZKENDH_cjs.faultedOperand(minutesValue);
2354
- if (clockFault) {
2355
- stack.push(clockFault);
2356
- break;
2357
- }
2358
- const totalMinutes = minutesValue.toNumber();
2359
- const now = /* @__PURE__ */ new Date();
2360
- const anchored = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0);
2361
- anchored.setMinutes(totalMinutes);
2362
- stack.push(chunk2TZKENDH_cjs.datetimeValue(anchored.getTime()));
2363
- break;
2364
- }
2365
- // ═══════════════════════════════════════════════════════════════
2366
- // §9 Datetime (OpCode 90–93)
2367
- // ═══════════════════════════════════════════════════════════════
2368
- case 90 /* DATE_NOW */:
2369
- stack.push(chunk2TZKENDH_cjs.datetimeValue(Date.now()));
2370
- break;
2371
- case 95 /* DATE_LITERAL */:
2372
- stack.push(chunk2TZKENDH_cjs.datetimeValue(numbers[poolIndex(opcodes, ip++, op, "constant-pool index", numbers.length, "number-pool")]));
2373
- break;
2374
- case 91 /* DATE_ADD */: {
2375
- const durValue = safePop(stack), dtValue = safePop(stack);
2376
- const dateAddFault = chunk2TZKENDH_cjs.faultedOperand(dtValue, durValue);
2377
- if (dateAddFault) {
2378
- stack.push(dateAddFault);
2379
- break;
2380
- }
2381
- stack.push(chunk2TZKENDH_cjs.datetimeValue(shiftDatetime(dtValue.toNumber(), durValue, 1, vm)));
2382
- break;
2383
- }
2384
- case 92 /* DATE_SUB */: {
2385
- const durValue = safePop(stack), dtValue = safePop(stack);
2386
- const dateSubFault = chunk2TZKENDH_cjs.faultedOperand(dtValue, durValue);
2387
- if (dateSubFault) {
2388
- stack.push(dateSubFault);
2389
- break;
2390
- }
2391
- stack.push(chunk2TZKENDH_cjs.datetimeValue(shiftDatetime(dtValue.toNumber(), durValue, -1, vm)));
2392
- break;
2393
- }
2394
- case 96 /* DATE_WORKDAY_OFFSET */: {
2395
- const workdayDirection = operandByte(opcodes, ip++, op, "workday offset direction") === 1 ? -1 : 1;
2396
- const anchorValue = safePop(stack), countValue = safePop(stack);
2397
- const offsetFault = chunk2TZKENDH_cjs.faultedOperand(countValue, anchorValue);
2398
- if (offsetFault) {
2399
- stack.push(offsetFault);
2400
- break;
2401
- }
2402
- if (anchorValue.type !== 4 /* Datetime */) {
2403
- stack.push(chunk2TZKENDH_cjs.errorValue(
2404
- chunkB4HBEFTB_cjs.CoreErrorCodes.WORKDAY_OFFSET_EXPECTED_DATE,
2405
- `"working days after/before/from" expects a date to count from, got ${chunk2TZKENDH_cjs.ValueType[anchorValue.type] ?? "an unsupported value"}`
2406
- ));
2407
- break;
2408
- }
2409
- stack.push(chunk2TZKENDH_cjs.datetimeValue(addBusinessDays2(anchorValue.toNumber(), workdayDirection * countValue.toNumber(), vm)));
2410
- break;
2411
- }
2412
- case 97 /* DATE_WORKDAYS_BETWEEN */: {
2413
- const endValue = safePop(stack), startValue = safePop(stack);
2414
- const betweenFault = chunk2TZKENDH_cjs.faultedOperand(startValue, endValue);
2415
- if (betweenFault) {
2416
- stack.push(betweenFault);
2417
- break;
2418
- }
2419
- if (startValue.type !== 4 /* Datetime */ || endValue.type !== 4 /* Datetime */) {
2420
- stack.push(chunk2TZKENDH_cjs.errorValue(
2421
- chunkB4HBEFTB_cjs.CoreErrorCodes.WORKDAYS_BETWEEN_EXPECTED_DATES,
2422
- `"working days between" expects two dates, got ${chunk2TZKENDH_cjs.ValueType[startValue.type] ?? "an unsupported value"} and ${chunk2TZKENDH_cjs.ValueType[endValue.type] ?? "an unsupported value"}`
2423
- ));
2424
- break;
2425
- }
2426
- const spanLimitDays = Math.ceil((vm.getMaxDateOffsetYears() - vm.getMinDateOffsetYears()) * 366);
2427
- const workdayCount = countBusinessDaysBetween(startValue.toNumber(), endValue.toNumber(), (ms) => vm.isHoliday(ms), spanLimitDays);
2428
- if (workdayCount === null) {
2429
- stack.push(chunk2TZKENDH_cjs.errorValue(
2430
- chunkB4HBEFTB_cjs.CoreErrorCodes.WORKDAYS_BETWEEN_RANGE_TOO_LARGE,
2431
- `The two dates are more than ${vm.getMaxDateOffsetYears() - vm.getMinDateOffsetYears()} years apart, past the working-day count's limit`
2432
- ));
2433
- break;
2434
- }
2435
- stack.push(chunk2TZKENDH_cjs.numberValue(workdayCount));
2436
- break;
2437
- }
2438
- case 93 /* DATE_NEXT_WEEKDAY */:
2439
- case 94 /* DATE_LAST_WEEKDAY */: {
2440
- const targetDayValue = safePop(stack);
2441
- const nowValue = safePop(stack);
2442
- const weekdayFault = chunk2TZKENDH_cjs.faultedOperand(nowValue, targetDayValue);
2443
- if (weekdayFault) {
2444
- stack.push(weekdayFault);
2445
- break;
2446
- }
2447
- const targetDay = targetDayValue.toNumber();
2448
- const now = nowValue.toNumber();
2449
- const currentDay = new Date(now).getDay();
2450
- let diffDays = op === 93 /* DATE_NEXT_WEEKDAY */ ? (targetDay - currentDay + 7) % 7 : (currentDay - targetDay + 7) % 7;
2451
- if (diffDays === 0) diffDays = 7;
2452
- stack.push(chunk2TZKENDH_cjs.datetimeValue(addCalendarDays(now, op === 93 /* DATE_NEXT_WEEKDAY */ ? diffDays : -diffDays)));
2453
- break;
2454
- }
2455
- // ═══════════════════════════════════════════════════════════════
2456
- // §10 Matrix (OpCode 152+, see parser/OpCode.ts's Matrix band)
2457
- // Replaces the old ARR_* vector-only opcodes (100-107), which
2458
- // were never emitted by any registered parselet in production
2459
- // confirmed dead code, deleted outright rather than repurposed.
2460
- // See vm/Value.ts's MatrixData and vm/MatrixOps.ts's shared
2461
- // column-major storage helpers.
2462
- // ═══════════════════════════════════════════════════════════════
2463
- case 152 /* MAT_NEW */: {
2464
- const rows = operandByte(opcodes, ip++, op, "row count");
2465
- const cols = operandByte(opcodes, ip++, op, "column count");
2466
- const count = rows * cols;
2467
- const rowMajor = chunk2TZKENDH_cjs.checkedArray(count, "matrix cells");
2468
- let cellFault = null;
2469
- for (let i = count - 1; i >= 0; i--) {
2470
- const cellVal = safePop(stack);
2471
- if (cellFault === null) cellFault = chunk2TZKENDH_cjs.faultedOperand(cellVal);
2472
- rowMajor[i] = cellVal.type === 10 /* Boolean */ ? cellVal.value : cellVal.type === 9 /* Symbolic */ ? cellVal.value : cellVal.toNumber();
2473
- }
2474
- if (cellFault) {
2475
- stack.push(cellFault);
2476
- break;
2477
- }
2478
- stack.push(chunk2TZKENDH_cjs.matrixValue(rows, cols, chunkHIQ5HSZL_cjs.rowMajorToColumnMajor(rows, cols, rowMajor)));
2479
- break;
2480
- }
2481
- case 153 /* MAT_INDEX1 */: {
2482
- const indexVal = safePop(stack), matrixVal = safePop(stack);
2483
- const index1Fault = chunk2TZKENDH_cjs.faultedOperand(matrixVal, indexVal);
2484
- if (index1Fault) {
2485
- stack.push(index1Fault);
2486
- break;
2487
- }
2488
- if (matrixVal.type !== 7 /* Matrix */) {
2489
- stack.push(chunk2TZKENDH_cjs.errorValue("MATRIX_INDEX_NOT_A_MATRIX", `Cannot index a non-matrix value with "[...]".`));
2490
- break;
2491
- }
2492
- const m = matrixVal.value;
2493
- const index = Math.trunc(indexVal.toNumber());
2494
- if (index < 0 || index >= m.data.length) {
2495
- stack.push(chunk2TZKENDH_cjs.errorValue(
2496
- "MATRIX_INDEX_OUT_OF_BOUNDS",
2497
- `Index ${index} is out of bounds for a ${m.rows}x${m.cols} matrix (valid range: 0-${m.data.length - 1}).`
2498
- ));
2499
- break;
2500
- }
2501
- const cell = chunkHIQ5HSZL_cjs.matIndex(m, index);
2502
- stack.push(chunkHIQ5HSZL_cjs.matrixEntryToValue(cell));
2503
- break;
2504
- }
2505
- case 154 /* MAT_INDEX2 */: {
2506
- const colVal = safePop(stack), rowVal = safePop(stack), matrixVal = safePop(stack);
2507
- const index2Fault = chunk2TZKENDH_cjs.faultedOperand(matrixVal, rowVal, colVal);
2508
- if (index2Fault) {
2509
- stack.push(index2Fault);
2510
- break;
2511
- }
2512
- if (matrixVal.type !== 7 /* Matrix */) {
2513
- stack.push(chunk2TZKENDH_cjs.errorValue("MATRIX_INDEX_NOT_A_MATRIX", `Cannot index a non-matrix value with "[...]".`));
2514
- break;
2515
- }
2516
- const m = matrixVal.value;
2517
- const row = Math.trunc(rowVal.toNumber());
2518
- const col = Math.trunc(colVal.toNumber());
2519
- if (!chunkHIQ5HSZL_cjs.inBounds(m, row, col)) {
2520
- stack.push(chunk2TZKENDH_cjs.errorValue(
2521
- "MATRIX_INDEX_OUT_OF_BOUNDS",
2522
- `[${row}, ${col}] is out of bounds for a ${m.rows}x${m.cols} matrix.`
2523
- ));
2524
- break;
2525
- }
2526
- const cell = chunkHIQ5HSZL_cjs.matAt(m, row, col);
2527
- stack.push(chunkHIQ5HSZL_cjs.matrixEntryToValue(cell));
2528
- break;
2529
- }
2530
- case 156 /* RANGE_NEW */: {
2531
- const maxVal = safePop(stack), minVal = safePop(stack);
2532
- const rangeFault = chunk2TZKENDH_cjs.faultedOperand(minVal, maxVal);
2533
- if (rangeFault) {
2534
- stack.push(rangeFault);
2535
- break;
2536
- }
2537
- if (minVal.type !== 0 /* Number */ || maxVal.type !== 0 /* Number */) {
2538
- stack.push(chunk2TZKENDH_cjs.errorValue("INVALID_RANGE_BOUND", `A range's bounds must be plain numbers (e.g. "0:3").`));
2539
- break;
2540
- }
2541
- const min = minVal.value;
2542
- const max = maxVal.value;
2543
- if (!Number.isInteger(min) || !Number.isInteger(max)) {
2544
- stack.push(chunk2TZKENDH_cjs.errorValue("NON_INTEGER_RANGE_BOUND", `A range's bounds must be whole numbers, got "${min}:${max}".`));
2545
- break;
2546
- }
2547
- if (min > max) {
2548
- stack.push(chunk2TZKENDH_cjs.errorValue(
2549
- "DESCENDING_RANGE",
2550
- `A range's min (${min}) cannot be greater than its max (${max}) \u2014 did you mean "${max}:${min}"?`
2551
- ));
2552
- break;
2553
- }
2554
- stack.push(chunk2TZKENDH_cjs.rangeValue(min, max));
2555
- break;
2556
- }
2557
- case 155 /* MAT_SLICE */: {
2558
- const colRangeVal = safePop(stack), rowRangeVal = safePop(stack), matrixVal = safePop(stack);
2559
- const sliceFault = chunk2TZKENDH_cjs.faultedOperand(matrixVal, rowRangeVal, colRangeVal);
2560
- if (sliceFault) {
2561
- stack.push(sliceFault);
2562
- break;
2563
- }
2564
- if (matrixVal.type !== 7 /* Matrix */) {
2565
- stack.push(chunk2TZKENDH_cjs.errorValue("MATRIX_INDEX_NOT_A_MATRIX", `Cannot slice a non-matrix value with "[...]".`));
2566
- break;
2567
- }
2568
- if (rowRangeVal.type !== 8 /* Range */ || colRangeVal.type !== 8 /* Range */) {
2569
- stack.push(chunk2TZKENDH_cjs.errorValue("INVALID_MATRIX_SLICE_BOUND", `Matrix slicing needs range bounds (e.g. "a[0:1, 1:2]").`));
2570
- break;
2571
- }
2572
- const m = matrixVal.value;
2573
- const rowRange = rowRangeVal.value;
2574
- const colRange = colRangeVal.value;
2575
- if (rowRange.min < 0 || rowRange.max >= m.rows || colRange.min < 0 || colRange.max >= m.cols) {
2576
- stack.push(chunk2TZKENDH_cjs.errorValue(
2577
- "MATRIX_INDEX_OUT_OF_BOUNDS",
2578
- `Slice [${rowRange.min}:${rowRange.max}, ${colRange.min}:${colRange.max}] is out of bounds for a ${m.rows}x${m.cols} matrix.`
2579
- ));
2580
- break;
2581
- }
2582
- const newRows = rowRange.max - rowRange.min + 1;
2583
- const newCols = colRange.max - colRange.min + 1;
2584
- const data = chunk2TZKENDH_cjs.checkedArray(newRows * newCols, "matrix cells");
2585
- for (let r = 0; r < newRows; r++) {
2586
- for (let c = 0; c < newCols; c++) {
2587
- data[r + c * newRows] = chunkHIQ5HSZL_cjs.matAt(m, rowRange.min + r, colRange.min + c);
2588
- }
2589
- }
2590
- stack.push(chunk2TZKENDH_cjs.matrixValue(newRows, newCols, data));
2591
- break;
2592
- }
2593
- // ═══════════════════════════════════════════════════════════════
2594
- // §11 map/reduce (OpCode 157-158, see parser/OpCode.ts's Matrix
2595
- // band). See packages/mapreduce/ for the parselets that decide
2596
- // `kind` (0=inline anonymous body, 1=builtin function,
2597
- // 2=user-defined function) at parse time, and
2598
- // `BytecodeBuilder.ts`'s AnonymousBodyDef doc comment for why
2599
- // kind-0 bodies are a SEPARATE side-table from userFunctionBodies.
2600
- // ═══════════════════════════════════════════════════════════════
2601
- case 157 /* MAP_INVOKE */: {
2602
- const kind = operandByte(opcodes, ip++, op, "body kind");
2603
- const ref = operandByte(opcodes, ip++, op, "body reference");
2604
- const collectionCount = operandByte(opcodes, ip++, op, "collection count");
2605
- requireKnownBodyKind(kind, ref, op);
2606
- const rawCollections = new Array(collectionCount);
2607
- for (let i = collectionCount - 1; i >= 0; i--) rawCollections[i] = safePop(stack);
2608
- let paramNames = [];
2609
- let program;
2610
- if (kind === 0) {
2611
- const def = anonymousBodies?.[ref];
2612
- if (!def) {
2613
- throw chunkB4HBEFTB_cjs.ErrorFactory.internal(
2614
- "INTERNAL_MISSING_ANONYMOUS_BODY",
2615
- `Internal error: MAP_INVOKE referenced missing anonymous body index ${ref}`,
2616
- { ref }
2617
- );
2618
- }
2619
- paramNames = def.params;
2620
- program = def.program;
2621
- } else if (kind === 2) {
2622
- const name = pooledString(strings, ref, op);
2623
- const fn = vm.getUserFunction(name);
2624
- if (!fn) {
2625
- stack.push(chunk2TZKENDH_cjs.errorValue("UNDEFINED_FUNCTION", `map: undefined function "${name}"`));
2626
- break;
2627
- }
2628
- if (fn.params.length !== collectionCount) {
2629
- stack.push(chunk2TZKENDH_cjs.errorValue(
2630
- "FUNCTION_ARITY_MISMATCH",
2631
- `map: "${name}" expects ${fn.params.length} argument(s) but ${collectionCount} collection(s) were given`
2632
- ));
2633
- break;
2634
- }
2635
- paramNames = fn.params;
2636
- program = fn.program;
2637
- }
2638
- let collectionLength = -1;
2639
- const cellArrays = new Array(collectionCount);
2640
- let mapEarlyError;
2641
- for (let i = 0; i < collectionCount; i++) {
2642
- const resolved = chunkHIQ5HSZL_cjs.collectionToValues(rawCollections[i], vm.getMaxCollectionSize());
2643
- if (!Array.isArray(resolved)) {
2644
- mapEarlyError = resolved;
2645
- break;
2646
- }
2647
- chunk2TZKENDH_cjs.chargeAllocation(resolved.length, "collection elements");
2648
- if (collectionLength === -1) {
2649
- collectionLength = resolved.length;
2650
- } else if (resolved.length !== collectionLength) {
2651
- mapEarlyError = chunk2TZKENDH_cjs.errorValue(
2652
- "MAP_COLLECTION_LENGTH_MISMATCH",
2653
- `map: all collections must have the same length (got ${collectionLength} and ${resolved.length}).`
2654
- );
2655
- break;
2656
- }
2657
- cellArrays[i] = resolved;
2658
- }
2659
- if (mapEarlyError) {
2660
- stack.push(mapEarlyError);
2661
- break;
2662
- }
2663
- const resultData = chunk2TZKENDH_cjs.checkedArray(collectionLength, "matrix cells");
2664
- let mapError;
2665
- for (let i = 0; i < collectionLength; i++) {
2666
- const args = new Array(collectionCount);
2667
- for (let j = 0; j < collectionCount; j++) args[j] = cellArrays[j][i];
2668
- const resultVal = kind === 1 ? chunk7ZX6B7SY_cjs.builtinFunctions[ref]?.(args) ?? chunk2TZKENDH_cjs.errorValue("UNKNOWN_BUILTIN_FUNCTION", `map: unknown builtin function index ${ref}`) : invokeFrameBody(paramNames, program, args, vm, pipeline, expression, context, !!symbolicTolerant);
2669
- const resultFault = chunk2TZKENDH_cjs.faultedOperand(resultVal);
2670
- if (resultFault) {
2671
- mapError = resultFault;
2672
- break;
2673
- }
2674
- resultData[i] = resultVal.type === 10 /* Boolean */ ? resultVal.value : resultVal.type === 9 /* Symbolic */ ? resultVal.value : resultVal.toNumber();
2675
- }
2676
- if (mapError) {
2677
- stack.push(mapError);
2678
- break;
2679
- }
2680
- const firstCollection = rawCollections[0];
2681
- const sourceShape = firstCollection?.type === 7 /* Matrix */ ? firstCollection.value : void 0;
2682
- if (sourceShape && sourceShape.rows * sourceShape.cols === collectionLength) {
2683
- stack.push(chunk2TZKENDH_cjs.matrixValue(sourceShape.rows, sourceShape.cols, resultData));
2684
- } else {
2685
- stack.push(chunk2TZKENDH_cjs.matrixValue(1, collectionLength, resultData));
2686
- }
2687
- break;
2688
- }
2689
- case 158 /* REDUCE_INVOKE */: {
2690
- const kind = operandByte(opcodes, ip++, op, "body kind");
2691
- const ref = operandByte(opcodes, ip++, op, "body reference");
2692
- const hasInitial = operandByte(opcodes, ip++, op, "initial-value flag");
2693
- requireKnownBodyKind(kind, ref, op);
2694
- const initialVal = hasInitial ? safePop(stack) : void 0;
2695
- const collectionVal = safePop(stack);
2696
- let paramNames = [];
2697
- let program;
2698
- if (kind === 0) {
2699
- const def = anonymousBodies?.[ref];
2700
- if (!def) {
2701
- throw chunkB4HBEFTB_cjs.ErrorFactory.internal(
2702
- "INTERNAL_MISSING_ANONYMOUS_BODY",
2703
- `Internal error: REDUCE_INVOKE referenced missing anonymous body index ${ref}`,
2704
- { ref }
2705
- );
2706
- }
2707
- paramNames = def.params;
2708
- program = def.program;
2709
- } else if (kind === 2) {
2710
- const name = pooledString(strings, ref, op);
2711
- const fn = vm.getUserFunction(name);
2712
- if (!fn) {
2713
- stack.push(chunk2TZKENDH_cjs.errorValue("UNDEFINED_FUNCTION", `reduce: undefined function "${name}"`));
2714
- break;
2715
- }
2716
- if (fn.params.length !== 2) {
2717
- stack.push(chunk2TZKENDH_cjs.errorValue(
2718
- "FUNCTION_ARITY_MISMATCH",
2719
- `reduce: "${name}" must take exactly 2 arguments (accumulator, element), got ${fn.params.length}`
2720
- ));
2721
- break;
2722
- }
2723
- paramNames = fn.params;
2724
- program = fn.program;
2725
- }
2726
- const cells = chunkHIQ5HSZL_cjs.collectionToValues(collectionVal, vm.getMaxCollectionSize());
2727
- if (!Array.isArray(cells)) {
2728
- stack.push(cells);
2729
- break;
2730
- }
2731
- chunk2TZKENDH_cjs.chargeAllocation(cells.length, "collection elements");
2732
- let acc;
2733
- let startIdx;
2734
- if (initialVal !== void 0) {
2735
- const initialFault = chunk2TZKENDH_cjs.faultedOperand(initialVal);
2736
- if (initialFault) {
2737
- stack.push(initialFault);
2738
- break;
2739
- }
2740
- acc = initialVal;
2741
- startIdx = 0;
2742
- } else {
2743
- if (cells.length === 0) {
2744
- stack.push(chunk2TZKENDH_cjs.errorValue("REDUCE_EMPTY_COLLECTION", `reduce: cannot reduce an empty collection without an initial value.`));
2745
- break;
2746
- }
2747
- acc = cells[0];
2748
- startIdx = 1;
2749
- }
2750
- let reduceError;
2751
- for (let i = startIdx; i < cells.length; i++) {
2752
- const args = [acc, cells[i]];
2753
- const resultVal = kind === 1 ? chunk7ZX6B7SY_cjs.builtinFunctions[ref]?.(args) ?? chunk2TZKENDH_cjs.errorValue("UNKNOWN_BUILTIN_FUNCTION", `reduce: unknown builtin function index ${ref}`) : invokeFrameBody(paramNames, program, args, vm, pipeline, expression, context, !!symbolicTolerant);
2754
- const stepFault = chunk2TZKENDH_cjs.faultedOperand(resultVal);
2755
- if (stepFault) {
2756
- reduceError = stepFault;
2757
- break;
2758
- }
2759
- acc = resultVal;
2760
- }
2761
- if (reduceError) {
2762
- stack.push(reduceError);
2763
- break;
2764
- }
2765
- stack.push(acc);
2766
- break;
2767
- }
2768
- // ═══════════════════════════════════════════════════════════════
2769
- // §12 Algebra verbs' bound unknown (OpCode 159)
2770
- // ═══════════════════════════════════════════════════════════════
2771
- case 159 /* BIND_UNKNOWN */: {
2772
- const ref = operandByte(opcodes, ip++, op, "body reference");
2773
- const def = anonymousBodies?.[ref];
2774
- if (!def) {
2775
- throw chunkB4HBEFTB_cjs.ErrorFactory.internal(
2776
- "INTERNAL_MISSING_ANONYMOUS_BODY",
2777
- `Internal error: BIND_UNKNOWN referenced missing anonymous body index ${ref}`,
2778
- { ref }
2779
- );
2780
- }
2781
- stack.push(invokeWithBoundUnknown(def.params[0], def.program, vm, pipeline, expression, context, !!symbolicTolerant));
2782
- break;
2783
- }
2784
- }
2785
- }
2786
- const fallback = safePop(stack);
2787
- return { type: "value", value: hasArena ? chunk2TZKENDH_cjs.persistentValue(fallback) : fallback };
2788
- } catch (e) {
2789
- return { type: "error", error: chunkB4HBEFTB_cjs.normalizeUnknownError(e) };
2790
- } finally {
2791
- chunk2TZKENDH_cjs.endEvaluation();
2792
- }
2793
- }
2794
-
2795
- exports.DependencyGraph = DependencyGraph;
2796
- exports.ScopeManager = ScopeManager;
2797
- exports.createVM = createVM;
2798
- exports.executeBytecode = executeBytecode;
2799
- //# sourceMappingURL=chunk-SRGQ72IR.cjs.map
2800
- //# sourceMappingURL=chunk-SRGQ72IR.cjs.map