numbl 0.4.7 → 0.4.9

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 (552) hide show
  1. package/dist-browser/browser/index.d.ts +21 -0
  2. package/dist-browser/browser/mip.d.ts +10 -0
  3. package/dist-browser/browser/protocol.d.ts +59 -0
  4. package/dist-browser/browser/session.d.ts +55 -0
  5. package/dist-browser/browser/system-store.d.ts +30 -0
  6. package/dist-browser/browser/worker.d.ts +1 -0
  7. package/dist-browser/browser.js +131 -0
  8. package/dist-browser/db/operations.d.ts +25 -0
  9. package/dist-browser/db/schema.d.ts +26 -0
  10. package/dist-browser/graphics/axisLimits.d.ts +23 -0
  11. package/dist-browser/graphics/figuresReducer.d.ts +86 -0
  12. package/dist-browser/graphics/types.d.ts +423 -0
  13. package/dist-browser/hooks/useProjectFiles.d.ts +45 -0
  14. package/dist-browser/numbl-core/diagnostics/errors.d.ts +8 -0
  15. package/dist-browser/numbl-core/diagnostics/index.d.ts +27 -0
  16. package/dist-browser/numbl-core/executeCode.d.ts +108 -0
  17. package/dist-browser/numbl-core/executors/cache.d.ts +26 -0
  18. package/dist-browser/numbl-core/executors/classification.d.ts +134 -0
  19. package/dist-browser/numbl-core/executors/context.d.ts +76 -0
  20. package/dist-browser/numbl-core/executors/handleInline.d.ts +58 -0
  21. package/dist-browser/numbl-core/executors/index.d.ts +14 -0
  22. package/dist-browser/numbl-core/executors/jit/cJitCallExecutor.d.ts +35 -0
  23. package/dist-browser/numbl-core/executors/jit/cJitLoopExecutor.d.ts +31 -0
  24. package/dist-browser/numbl-core/executors/jit/cJitTopLevelExecutor.d.ts +29 -0
  25. package/dist-browser/numbl-core/executors/jit/callExecutor.d.ts +45 -0
  26. package/dist-browser/numbl-core/executors/jit/compileC.d.ts +51 -0
  27. package/dist-browser/numbl-core/executors/jit/compileC.node.d.ts +25 -0
  28. package/dist-browser/numbl-core/executors/jit/hostHelpers.d.ts +31 -0
  29. package/dist-browser/numbl-core/executors/jit/loopExecutor.d.ts +41 -0
  30. package/dist-browser/numbl-core/executors/jit/session.d.ts +17 -0
  31. package/dist-browser/numbl-core/executors/jit/topLevelExecutor.d.ts +36 -0
  32. package/dist-browser/numbl-core/executors/jit/typeAdapter.d.ts +28 -0
  33. package/dist-browser/numbl-core/executors/jit/typeAdapterC.d.ts +73 -0
  34. package/dist-browser/numbl-core/executors/jit/valueAdapter.d.ts +55 -0
  35. package/dist-browser/numbl-core/executors/jit/valueAdapterC.d.ts +108 -0
  36. package/dist-browser/numbl-core/executors/lowering.d.ts +120 -0
  37. package/dist-browser/numbl-core/executors/plugins.d.ts +41 -0
  38. package/dist-browser/numbl-core/executors/registry.d.ts +148 -0
  39. package/dist-browser/numbl-core/executors/types.d.ts +103 -0
  40. package/dist-browser/numbl-core/externalAccessDirective.d.ts +6 -0
  41. package/dist-browser/numbl-core/fileIOAdapter.d.ts +88 -0
  42. package/dist-browser/numbl-core/functionResolve.d.ts +70 -0
  43. package/dist-browser/numbl-core/helpers/arithmetic.d.ts +47 -0
  44. package/dist-browser/numbl-core/helpers/bessel.d.ts +49 -0
  45. package/dist-browser/numbl-core/helpers/check-helpers.d.ts +49 -0
  46. package/dist-browser/numbl-core/helpers/constants.d.ts +6 -0
  47. package/dist-browser/numbl-core/helpers/dummy.d.ts +5 -0
  48. package/dist-browser/numbl-core/helpers/effectively-real.d.ts +25 -0
  49. package/dist-browser/numbl-core/helpers/eigs-select.d.ts +25 -0
  50. package/dist-browser/numbl-core/helpers/erf.d.ts +5 -0
  51. package/dist-browser/numbl-core/helpers/gmres.d.ts +51 -0
  52. package/dist-browser/numbl-core/helpers/linsolve.d.ts +25 -0
  53. package/dist-browser/numbl-core/helpers/marching-cubes-tables.d.ts +10 -0
  54. package/dist-browser/numbl-core/helpers/marching-cubes.d.ts +46 -0
  55. package/dist-browser/numbl-core/helpers/ode-rk.d.ts +83 -0
  56. package/dist-browser/numbl-core/helpers/prng.d.ts +19 -0
  57. package/dist-browser/numbl-core/helpers/quadgk.d.ts +32 -0
  58. package/dist-browser/numbl-core/helpers/reduction/cumulative.d.ts +8 -0
  59. package/dist-browser/numbl-core/helpers/reduction/min-max.d.ts +5 -0
  60. package/dist-browser/numbl-core/helpers/reduction-helpers.d.ts +66 -0
  61. package/dist-browser/numbl-core/helpers/registry.d.ts +7 -0
  62. package/dist-browser/numbl-core/helpers/scanFormat.d.ts +11 -0
  63. package/dist-browser/numbl-core/helpers/shape-utils.d.ts +7 -0
  64. package/dist-browser/numbl-core/helpers/sparse-arithmetic.d.ts +16 -0
  65. package/dist-browser/numbl-core/helpers/string.d.ts +11 -0
  66. package/dist-browser/numbl-core/interpreter/builtins/arithmetic.d.ts +4 -0
  67. package/dist-browser/numbl-core/interpreter/builtins/array-construction.d.ts +10 -0
  68. package/dist-browser/numbl-core/interpreter/builtins/array-extras.d.ts +5 -0
  69. package/dist-browser/numbl-core/interpreter/builtins/array-manipulation.d.ts +7 -0
  70. package/dist-browser/numbl-core/interpreter/builtins/cell-struct.d.ts +5 -0
  71. package/dist-browser/numbl-core/interpreter/builtins/complex.d.ts +4 -0
  72. package/dist-browser/numbl-core/interpreter/builtins/datetime.d.ts +40 -0
  73. package/dist-browser/numbl-core/interpreter/builtins/dictionary.d.ts +15 -0
  74. package/dist-browser/numbl-core/interpreter/builtins/fft.d.ts +7 -0
  75. package/dist-browser/numbl-core/interpreter/builtins/gallery.d.ts +7 -0
  76. package/dist-browser/numbl-core/interpreter/builtins/geometry.d.ts +10 -0
  77. package/dist-browser/numbl-core/interpreter/builtins/graph.d.ts +29 -0
  78. package/dist-browser/numbl-core/interpreter/builtins/help-text.d.ts +5 -0
  79. package/dist-browser/numbl-core/interpreter/builtins/index.d.ts +39 -0
  80. package/dist-browser/numbl-core/interpreter/builtins/introspection.d.ts +6 -0
  81. package/dist-browser/numbl-core/interpreter/builtins/linear-algebra.d.ts +9 -0
  82. package/dist-browser/numbl-core/interpreter/builtins/logical.d.ts +9 -0
  83. package/dist-browser/numbl-core/interpreter/builtins/math.d.ts +4 -0
  84. package/dist-browser/numbl-core/interpreter/builtins/misc.d.ts +7 -0
  85. package/dist-browser/numbl-core/interpreter/builtins/numerical.d.ts +10 -0
  86. package/dist-browser/numbl-core/interpreter/builtins/predicates.d.ts +4 -0
  87. package/dist-browser/numbl-core/interpreter/builtins/prng.d.ts +4 -0
  88. package/dist-browser/numbl-core/interpreter/builtins/reductions.d.ts +6 -0
  89. package/dist-browser/numbl-core/interpreter/builtins/set-operations.d.ts +4 -0
  90. package/dist-browser/numbl-core/interpreter/builtins/sparse.d.ts +4 -0
  91. package/dist-browser/numbl-core/interpreter/builtins/special-math.d.ts +4 -0
  92. package/dist-browser/numbl-core/interpreter/builtins/string-extras.d.ts +5 -0
  93. package/dist-browser/numbl-core/interpreter/builtins/strings.d.ts +7 -0
  94. package/dist-browser/numbl-core/interpreter/builtins/time-system.d.ts +6 -0
  95. package/dist-browser/numbl-core/interpreter/builtins/type-constructors.d.ts +5 -0
  96. package/dist-browser/numbl-core/interpreter/builtins/types.d.ts +98 -0
  97. package/dist-browser/numbl-core/interpreter/builtins/utility.d.ts +4 -0
  98. package/dist-browser/numbl-core/interpreter/builtins/validation.d.ts +4 -0
  99. package/dist-browser/numbl-core/interpreter/interpreter.d.ts +199 -0
  100. package/dist-browser/numbl-core/interpreter/interpreterExec.d.ts +81 -0
  101. package/dist-browser/numbl-core/interpreter/interpreterFunctions.d.ts +62 -0
  102. package/dist-browser/numbl-core/interpreter/interpreterSpecialBuiltins.d.ts +35 -0
  103. package/dist-browser/numbl-core/interpreter/types.d.ts +114 -0
  104. package/dist-browser/numbl-core/jit/builtins/defs/_shared.d.ts +43 -0
  105. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/_elemwise.d.ts +123 -0
  106. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/minus.d.ts +2 -0
  107. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mpower.d.ts +12 -0
  108. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mrdivide.d.ts +5 -0
  109. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mtimes.d.ts +2 -0
  110. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/plus.d.ts +2 -0
  111. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/power.d.ts +30 -0
  112. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/rdivide.d.ts +2 -0
  113. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/times.d.ts +2 -0
  114. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/uminus.d.ts +2 -0
  115. package/dist-browser/numbl-core/jit/builtins/defs/compare/_compare.d.ts +12 -0
  116. package/dist-browser/numbl-core/jit/builtins/defs/compare/eq.d.ts +2 -0
  117. package/dist-browser/numbl-core/jit/builtins/defs/compare/ge.d.ts +2 -0
  118. package/dist-browser/numbl-core/jit/builtins/defs/compare/gt.d.ts +2 -0
  119. package/dist-browser/numbl-core/jit/builtins/defs/compare/le.d.ts +2 -0
  120. package/dist-browser/numbl-core/jit/builtins/defs/compare/lt.d.ts +2 -0
  121. package/dist-browser/numbl-core/jit/builtins/defs/compare/ne.d.ts +2 -0
  122. package/dist-browser/numbl-core/jit/builtins/defs/diag/assert.d.ts +6 -0
  123. package/dist-browser/numbl-core/jit/builtins/defs/io/_format_args.d.ts +17 -0
  124. package/dist-browser/numbl-core/jit/builtins/defs/io/disp.d.ts +2 -0
  125. package/dist-browser/numbl-core/jit/builtins/defs/io/error.d.ts +2 -0
  126. package/dist-browser/numbl-core/jit/builtins/defs/io/fprintf.d.ts +2 -0
  127. package/dist-browser/numbl-core/jit/builtins/defs/io/sprintf.d.ts +2 -0
  128. package/dist-browser/numbl-core/jit/builtins/defs/io/warning.d.ts +15 -0
  129. package/dist-browser/numbl-core/jit/builtins/defs/logical/_shortcircuit.d.ts +30 -0
  130. package/dist-browser/numbl-core/jit/builtins/defs/logical/_unary_pred.d.ts +30 -0
  131. package/dist-browser/numbl-core/jit/builtins/defs/logical/and.d.ts +5 -0
  132. package/dist-browser/numbl-core/jit/builtins/defs/logical/andand.d.ts +1 -0
  133. package/dist-browser/numbl-core/jit/builtins/defs/logical/boolconst.d.ts +3 -0
  134. package/dist-browser/numbl-core/jit/builtins/defs/logical/classBuiltin.d.ts +21 -0
  135. package/dist-browser/numbl-core/jit/builtins/defs/logical/fieldnames.d.ts +15 -0
  136. package/dist-browser/numbl-core/jit/builtins/defs/logical/isa.d.ts +13 -0
  137. package/dist-browser/numbl-core/jit/builtins/defs/logical/iscell.d.ts +8 -0
  138. package/dist-browser/numbl-core/jit/builtins/defs/logical/isempty.d.ts +2 -0
  139. package/dist-browser/numbl-core/jit/builtins/defs/logical/isequal.d.ts +2 -0
  140. package/dist-browser/numbl-core/jit/builtins/defs/logical/isfield.d.ts +20 -0
  141. package/dist-browser/numbl-core/jit/builtins/defs/logical/isinf.d.ts +2 -0
  142. package/dist-browser/numbl-core/jit/builtins/defs/logical/isnan.d.ts +1 -0
  143. package/dist-browser/numbl-core/jit/builtins/defs/logical/isnumeric.d.ts +7 -0
  144. package/dist-browser/numbl-core/jit/builtins/defs/logical/isreal.d.ts +2 -0
  145. package/dist-browser/numbl-core/jit/builtins/defs/logical/isscalar.d.ts +20 -0
  146. package/dist-browser/numbl-core/jit/builtins/defs/logical/isstruct.d.ts +7 -0
  147. package/dist-browser/numbl-core/jit/builtins/defs/logical/logical.d.ts +1 -0
  148. package/dist-browser/numbl-core/jit/builtins/defs/logical/not.d.ts +15 -0
  149. package/dist-browser/numbl-core/jit/builtins/defs/logical/or.d.ts +11 -0
  150. package/dist-browser/numbl-core/jit/builtins/defs/logical/oror.d.ts +1 -0
  151. package/dist-browser/numbl-core/jit/builtins/defs/logical/strcmp.d.ts +21 -0
  152. package/dist-browser/numbl-core/jit/builtins/defs/logical/typequery.d.ts +10 -0
  153. package/dist-browser/numbl-core/jit/builtins/defs/logical/xor.d.ts +12 -0
  154. package/dist-browser/numbl-core/jit/builtins/defs/math/_complex_fold.d.ts +34 -0
  155. package/dist-browser/numbl-core/jit/builtins/defs/math/_unary_real.d.ts +51 -0
  156. package/dist-browser/numbl-core/jit/builtins/defs/math/abs.d.ts +7 -0
  157. package/dist-browser/numbl-core/jit/builtins/defs/math/angle.d.ts +7 -0
  158. package/dist-browser/numbl-core/jit/builtins/defs/math/asinh.d.ts +1 -0
  159. package/dist-browser/numbl-core/jit/builtins/defs/math/atan.d.ts +1 -0
  160. package/dist-browser/numbl-core/jit/builtins/defs/math/atan2.d.ts +3 -0
  161. package/dist-browser/numbl-core/jit/builtins/defs/math/besselh.d.ts +2 -0
  162. package/dist-browser/numbl-core/jit/builtins/defs/math/ceil.d.ts +4 -0
  163. package/dist-browser/numbl-core/jit/builtins/defs/math/conj.d.ts +7 -0
  164. package/dist-browser/numbl-core/jit/builtins/defs/math/constants.d.ts +7 -0
  165. package/dist-browser/numbl-core/jit/builtins/defs/math/cos.d.ts +1 -0
  166. package/dist-browser/numbl-core/jit/builtins/defs/math/cosh.d.ts +1 -0
  167. package/dist-browser/numbl-core/jit/builtins/defs/math/dot.d.ts +20 -0
  168. package/dist-browser/numbl-core/jit/builtins/defs/math/double.d.ts +28 -0
  169. package/dist-browser/numbl-core/jit/builtins/defs/math/exp.d.ts +1 -0
  170. package/dist-browser/numbl-core/jit/builtins/defs/math/fix.d.ts +4 -0
  171. package/dist-browser/numbl-core/jit/builtins/defs/math/floor.d.ts +4 -0
  172. package/dist-browser/numbl-core/jit/builtins/defs/math/hypot.d.ts +3 -0
  173. package/dist-browser/numbl-core/jit/builtins/defs/math/imag.d.ts +7 -0
  174. package/dist-browser/numbl-core/jit/builtins/defs/math/linspace.d.ts +6 -0
  175. package/dist-browser/numbl-core/jit/builtins/defs/math/log.d.ts +4 -0
  176. package/dist-browser/numbl-core/jit/builtins/defs/math/log10.d.ts +3 -0
  177. package/dist-browser/numbl-core/jit/builtins/defs/math/log2.d.ts +5 -0
  178. package/dist-browser/numbl-core/jit/builtins/defs/math/logspace.d.ts +8 -0
  179. package/dist-browser/numbl-core/jit/builtins/defs/math/mod.d.ts +1 -0
  180. package/dist-browser/numbl-core/jit/builtins/defs/math/norm.d.ts +2 -0
  181. package/dist-browser/numbl-core/jit/builtins/defs/math/rand.d.ts +2 -0
  182. package/dist-browser/numbl-core/jit/builtins/defs/math/real.d.ts +7 -0
  183. package/dist-browser/numbl-core/jit/builtins/defs/math/rem.d.ts +3 -0
  184. package/dist-browser/numbl-core/jit/builtins/defs/math/round.d.ts +1 -0
  185. package/dist-browser/numbl-core/jit/builtins/defs/math/sign.d.ts +5 -0
  186. package/dist-browser/numbl-core/jit/builtins/defs/math/sin.d.ts +1 -0
  187. package/dist-browser/numbl-core/jit/builtins/defs/math/sinh.d.ts +1 -0
  188. package/dist-browser/numbl-core/jit/builtins/defs/math/sqrt.d.ts +11 -0
  189. package/dist-browser/numbl-core/jit/builtins/defs/math/tan.d.ts +1 -0
  190. package/dist-browser/numbl-core/jit/builtins/defs/math/tanh.d.ts +1 -0
  191. package/dist-browser/numbl-core/jit/builtins/defs/math/uniquetol.d.ts +22 -0
  192. package/dist-browser/numbl-core/jit/builtins/defs/plot/dispatch.d.ts +6 -0
  193. package/dist-browser/numbl-core/jit/builtins/defs/reduction/_cumulative.d.ts +49 -0
  194. package/dist-browser/numbl-core/jit/builtins/defs/reduction/_shape.d.ts +126 -0
  195. package/dist-browser/numbl-core/jit/builtins/defs/reduction/_variance.d.ts +17 -0
  196. package/dist-browser/numbl-core/jit/builtins/defs/reduction/all.d.ts +1 -0
  197. package/dist-browser/numbl-core/jit/builtins/defs/reduction/any.d.ts +1 -0
  198. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cummax.d.ts +1 -0
  199. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cummin.d.ts +1 -0
  200. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cumprod.d.ts +1 -0
  201. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cumsum.d.ts +1 -0
  202. package/dist-browser/numbl-core/jit/builtins/defs/reduction/diff.d.ts +16 -0
  203. package/dist-browser/numbl-core/jit/builtins/defs/reduction/length.d.ts +2 -0
  204. package/dist-browser/numbl-core/jit/builtins/defs/reduction/max.d.ts +1 -0
  205. package/dist-browser/numbl-core/jit/builtins/defs/reduction/mean.d.ts +1 -0
  206. package/dist-browser/numbl-core/jit/builtins/defs/reduction/min.d.ts +1 -0
  207. package/dist-browser/numbl-core/jit/builtins/defs/reduction/numel.d.ts +2 -0
  208. package/dist-browser/numbl-core/jit/builtins/defs/reduction/prod.d.ts +1 -0
  209. package/dist-browser/numbl-core/jit/builtins/defs/reduction/std.d.ts +1 -0
  210. package/dist-browser/numbl-core/jit/builtins/defs/reduction/sum.d.ts +1 -0
  211. package/dist-browser/numbl-core/jit/builtins/defs/reduction/var.d.ts +1 -0
  212. package/dist-browser/numbl-core/jit/builtins/defs/shape/_construct.d.ts +67 -0
  213. package/dist-browser/numbl-core/jit/builtins/defs/shape/_triangular.d.ts +34 -0
  214. package/dist-browser/numbl-core/jit/builtins/defs/shape/cat.d.ts +33 -0
  215. package/dist-browser/numbl-core/jit/builtins/defs/shape/diag.d.ts +29 -0
  216. package/dist-browser/numbl-core/jit/builtins/defs/shape/eye.d.ts +5 -0
  217. package/dist-browser/numbl-core/jit/builtins/defs/shape/flip.d.ts +7 -0
  218. package/dist-browser/numbl-core/jit/builtins/defs/shape/meshgrid.d.ts +12 -0
  219. package/dist-browser/numbl-core/jit/builtins/defs/shape/ones.d.ts +1 -0
  220. package/dist-browser/numbl-core/jit/builtins/defs/shape/repmat.d.ts +37 -0
  221. package/dist-browser/numbl-core/jit/builtins/defs/shape/reshape.d.ts +39 -0
  222. package/dist-browser/numbl-core/jit/builtins/defs/shape/size.d.ts +20 -0
  223. package/dist-browser/numbl-core/jit/builtins/defs/shape/sort.d.ts +19 -0
  224. package/dist-browser/numbl-core/jit/builtins/defs/shape/transpose.d.ts +6 -0
  225. package/dist-browser/numbl-core/jit/builtins/defs/shape/tril.d.ts +16 -0
  226. package/dist-browser/numbl-core/jit/builtins/defs/shape/triu.d.ts +16 -0
  227. package/dist-browser/numbl-core/jit/builtins/defs/shape/zeros.d.ts +1 -0
  228. package/dist-browser/numbl-core/jit/builtins/defs/system/deal.d.ts +20 -0
  229. package/dist-browser/numbl-core/jit/builtins/defs/system/feval.d.ts +36 -0
  230. package/dist-browser/numbl-core/jit/builtins/defs/system/pathBuiltins.d.ts +4 -0
  231. package/dist-browser/numbl-core/jit/builtins/defs/system/tic.d.ts +8 -0
  232. package/dist-browser/numbl-core/jit/builtins/defs/system/toc.d.ts +5 -0
  233. package/dist-browser/numbl-core/jit/builtins/index.d.ts +16 -0
  234. package/dist-browser/numbl-core/jit/builtins/registry.d.ts +138 -0
  235. package/dist-browser/numbl-core/jit/builtins/runtime/cell/cell.d.ts +24 -0
  236. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/loop_count.d.ts +1 -0
  237. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/range_value.d.ts +1 -0
  238. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/scalar_index.d.ts +11 -0
  239. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/tensor_make_range.d.ts +5 -0
  240. package/dist-browser/numbl-core/jit/builtins/runtime/io/assert_fmt.d.ts +1 -0
  241. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_complex.d.ts +1 -0
  242. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_double.d.ts +1 -0
  243. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_struct.d.ts +1 -0
  244. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_tensor.d.ts +1 -0
  245. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_tensor_complex.d.ts +1 -0
  246. package/dist-browser/numbl-core/jit/builtins/runtime/io/error_fmt.d.ts +2 -0
  247. package/dist-browser/numbl-core/jit/builtins/runtime/io/format_complex.d.ts +1 -0
  248. package/dist-browser/numbl-core/jit/builtins/runtime/io/format_double.d.ts +1 -0
  249. package/dist-browser/numbl-core/jit/builtins/runtime/io/format_engine.d.ts +1 -0
  250. package/dist-browser/numbl-core/jit/builtins/runtime/io/fprintf.d.ts +1 -0
  251. package/dist-browser/numbl-core/jit/builtins/runtime/io/sprintf.d.ts +5 -0
  252. package/dist-browser/numbl-core/jit/builtins/runtime/io/warning_fmt.d.ts +2 -0
  253. package/dist-browser/numbl-core/jit/builtins/runtime/plot/plot_dispatch.d.ts +1 -0
  254. package/dist-browser/numbl-core/jit/builtins/runtime/snippets.c.gen.d.ts +4 -0
  255. package/dist-browser/numbl-core/jit/builtins/runtime/snippets.gen.d.ts +85 -0
  256. package/dist-browser/numbl-core/jit/builtins/runtime/system/cdiv.d.ts +4 -0
  257. package/dist-browser/numbl-core/jit/builtins/runtime/system/cscalar.d.ts +103 -0
  258. package/dist-browser/numbl-core/jit/builtins/runtime/system/deep_clone.d.ts +1 -0
  259. package/dist-browser/numbl-core/jit/builtins/runtime/system/isequal.d.ts +2 -0
  260. package/dist-browser/numbl-core/jit/builtins/runtime/system/tictoc.d.ts +5 -0
  261. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor.d.ts +6 -0
  262. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc.d.ts +5 -0
  263. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_complex.d.ts +6 -0
  264. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_nd.d.ts +5 -0
  265. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_nd_complex.d.ts +6 -0
  266. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_copy_complex.d.ts +6 -0
  267. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_matrix.d.ts +5 -0
  268. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_matrix_complex.d.ts +6 -0
  269. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_row.d.ts +5 -0
  270. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_row_complex.d.ts +6 -0
  271. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_cat.d.ts +11 -0
  272. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_cumulative.d.ts +32 -0
  273. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_diag.d.ts +33 -0
  274. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_diff.d.ts +5 -0
  275. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_dot.d.ts +16 -0
  276. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_complex.d.ts +90 -0
  277. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_real.d.ts +75 -0
  278. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_real_fn.d.ts +95 -0
  279. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_eye.d.ts +10 -0
  280. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_fill_nd.d.ts +11 -0
  281. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_fill_square.d.ts +5 -0
  282. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_flip.d.ts +11 -0
  283. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_imag_all_zero.d.ts +1 -0
  284. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_linspace.d.ts +5 -0
  285. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_logical_real.d.ts +10 -0
  286. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_logspace.d.ts +5 -0
  287. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_meshgrid.d.ts +29 -0
  288. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_mtimes_complex.d.ts +10 -0
  289. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_mtimes_real.d.ts +6 -0
  290. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_norm.d.ts +4 -0
  291. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_ones_nd.d.ts +5 -0
  292. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_ones_square.d.ts +5 -0
  293. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_predicate.d.ts +42 -0
  294. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reduce_complex.d.ts +53 -0
  295. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reduce_real.d.ts +42 -0
  296. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_repmat.d.ts +11 -0
  297. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reshape_nd.d.ts +5 -0
  298. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reshape_nd_complex.d.ts +6 -0
  299. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_size.d.ts +5 -0
  300. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_sort_real.d.ts +36 -0
  301. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_transpose.d.ts +5 -0
  302. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_transpose_complex.d.ts +6 -0
  303. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_triangular.d.ts +22 -0
  304. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_unary_complex_math.d.ts +128 -0
  305. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_unary_real_math.d.ts +95 -0
  306. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_uniquetol.d.ts +5 -0
  307. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_var.d.ts +12 -0
  308. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_zeros_nd.d.ts +5 -0
  309. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_zeros_square.d.ts +5 -0
  310. package/dist-browser/numbl-core/jit/builtins/runtime/text/strcmp.d.ts +2 -0
  311. package/dist-browser/numbl-core/jit/codegen/cFormat.d.ts +36 -0
  312. package/dist-browser/numbl-core/jit/codegen/cHelpers.d.ts +48 -0
  313. package/dist-browser/numbl-core/jit/codegen/emit.d.ts +55 -0
  314. package/dist-browser/numbl-core/jit/codegen/emitCellTypedef.d.ts +23 -0
  315. package/dist-browser/numbl-core/jit/codegen/emitExpr.d.ts +33 -0
  316. package/dist-browser/numbl-core/jit/codegen/emitIndex.d.ts +56 -0
  317. package/dist-browser/numbl-core/jit/codegen/emitJs.d.ts +64 -0
  318. package/dist-browser/numbl-core/jit/codegen/emitNamedTypedef.d.ts +58 -0
  319. package/dist-browser/numbl-core/jit/codegen/emitStmt.d.ts +76 -0
  320. package/dist-browser/numbl-core/jit/codegen/emitTensorConcat.d.ts +23 -0
  321. package/dist-browser/numbl-core/jit/codegen/emitTensorConcatJs.d.ts +16 -0
  322. package/dist-browser/numbl-core/jit/codegen/emitTensorFused.d.ts +77 -0
  323. package/dist-browser/numbl-core/jit/codegen/inlinePass.d.ts +66 -0
  324. package/dist-browser/numbl-core/jit/codegen/liveness.d.ts +58 -0
  325. package/dist-browser/numbl-core/jit/codegen/prettyIR.d.ts +24 -0
  326. package/dist-browser/numbl-core/jit/codegen/runtime.d.ts +152 -0
  327. package/dist-browser/numbl-core/jit/compileSpec.d.ts +84 -0
  328. package/dist-browser/numbl-core/jit/compileSpecC.d.ts +100 -0
  329. package/dist-browser/numbl-core/jit/index.d.ts +15 -0
  330. package/dist-browser/numbl-core/jit/lowering/classDefs.d.ts +109 -0
  331. package/dist-browser/numbl-core/jit/lowering/definiteAssign.d.ts +42 -0
  332. package/dist-browser/numbl-core/jit/lowering/errors.d.ts +35 -0
  333. package/dist-browser/numbl-core/jit/lowering/indexFold.d.ts +31 -0
  334. package/dist-browser/numbl-core/jit/lowering/indexResolve.d.ts +100 -0
  335. package/dist-browser/numbl-core/jit/lowering/ir.d.ts +584 -0
  336. package/dist-browser/numbl-core/jit/lowering/lower.d.ts +271 -0
  337. package/dist-browser/numbl-core/jit/lowering/lowerCellIndex.d.ts +41 -0
  338. package/dist-browser/numbl-core/jit/lowering/lowerCellLit.d.ts +19 -0
  339. package/dist-browser/numbl-core/jit/lowering/lowerClassConstructor.d.ts +55 -0
  340. package/dist-browser/numbl-core/jit/lowering/lowerFuncCall.d.ts +34 -0
  341. package/dist-browser/numbl-core/jit/lowering/lowerHandle.d.ts +57 -0
  342. package/dist-browser/numbl-core/jit/lowering/lowerIndexLoad.d.ts +16 -0
  343. package/dist-browser/numbl-core/jit/lowering/lowerIndexSlice.d.ts +29 -0
  344. package/dist-browser/numbl-core/jit/lowering/lowerIndexSliceStore.d.ts +19 -0
  345. package/dist-browser/numbl-core/jit/lowering/lowerIndexStore.d.ts +14 -0
  346. package/dist-browser/numbl-core/jit/lowering/lowerMethodCall.d.ts +45 -0
  347. package/dist-browser/numbl-core/jit/lowering/lowerMultiAssign.d.ts +36 -0
  348. package/dist-browser/numbl-core/jit/lowering/lowerTensorLit.d.ts +25 -0
  349. package/dist-browser/numbl-core/jit/lowering/rangeCount.d.ts +19 -0
  350. package/dist-browser/numbl-core/jit/lowering/specialize.d.ts +93 -0
  351. package/dist-browser/numbl-core/jit/lowering/types.d.ts +503 -0
  352. package/dist-browser/numbl-core/jit/lowering/walk.d.ts +17 -0
  353. package/dist-browser/numbl-core/jit/numbl/index.d.ts +30 -0
  354. package/dist-browser/numbl-core/jit/parser/astUtils.d.ts +43 -0
  355. package/dist-browser/numbl-core/jit/parser/index.d.ts +12 -0
  356. package/dist-browser/numbl-core/jit/parser/sourceLoc.d.ts +12 -0
  357. package/dist-browser/numbl-core/jit/runtime/context.d.ts +23 -0
  358. package/dist-browser/numbl-core/jit/runtime/inferType.d.ts +10 -0
  359. package/dist-browser/numbl-core/jit/runtime/value.d.ts +101 -0
  360. package/dist-browser/numbl-core/jit/workspace/driverPrologue.d.ts +59 -0
  361. package/dist-browser/numbl-core/jit/workspace/mtoc2UserFunctionLoader.d.ts +62 -0
  362. package/dist-browser/numbl-core/jit/workspace/workspace.d.ts +243 -0
  363. package/dist-browser/numbl-core/jitDeclineDiagnostics.d.ts +32 -0
  364. package/dist-browser/numbl-core/jitTypes.d.ts +94 -0
  365. package/dist-browser/numbl-core/jsUserFunctions.d.ts +61 -0
  366. package/dist-browser/numbl-core/lexer/helpers.d.ts +15 -0
  367. package/dist-browser/numbl-core/lexer/index.d.ts +4 -0
  368. package/dist-browser/numbl-core/lexer/keywords.d.ts +3 -0
  369. package/dist-browser/numbl-core/lexer/token-config.d.ts +94 -0
  370. package/dist-browser/numbl-core/lexer/tokenizer.d.ts +9 -0
  371. package/dist-browser/numbl-core/lexer/types.d.ts +80 -0
  372. package/dist-browser/numbl-core/lowering/classInfo.d.ts +53 -0
  373. package/dist-browser/numbl-core/lowering/constants.d.ts +4 -0
  374. package/dist-browser/numbl-core/lowering/errors.d.ts +17 -0
  375. package/dist-browser/numbl-core/lowering/index.d.ts +3 -0
  376. package/dist-browser/numbl-core/lowering/itemTypes.d.ts +87 -0
  377. package/dist-browser/numbl-core/lowering/loweringContext.d.ts +241 -0
  378. package/dist-browser/numbl-core/native/bridge-resolve.d.ts +14 -0
  379. package/dist-browser/numbl-core/native/geometry-bridge.d.ts +39 -0
  380. package/dist-browser/numbl-core/native/lapack-bridge.d.ts +482 -0
  381. package/dist-browser/numbl-core/native/qhull-browser.d.ts +15 -0
  382. package/dist-browser/numbl-core/native/qhull-node.d.ts +13 -0
  383. package/dist-browser/numbl-core/native/ts-lapack-bridge.d.ts +9 -0
  384. package/dist-browser/numbl-core/native/ts-lapack-eig-complex.d.ts +32 -0
  385. package/dist-browser/numbl-core/ops/bessel.d.ts +18 -0
  386. package/dist-browser/numbl-core/ops/comparison.d.ts +11 -0
  387. package/dist-browser/numbl-core/ops/complexBinaryElemwise.d.ts +10 -0
  388. package/dist-browser/numbl-core/ops/complexUnaryElemwise.d.ts +8 -0
  389. package/dist-browser/numbl-core/ops/dispatch.d.ts +26 -0
  390. package/dist-browser/numbl-core/ops/index.d.ts +8 -0
  391. package/dist-browser/numbl-core/ops/opCodes.d.ts +70 -0
  392. package/dist-browser/numbl-core/ops/realBinaryElemwise.d.ts +8 -0
  393. package/dist-browser/numbl-core/ops/realUnaryElemwise.d.ts +5 -0
  394. package/dist-browser/numbl-core/ops/reduce.d.ts +6 -0
  395. package/dist-browser/numbl-core/parser/ArgumentsParser.d.ts +33 -0
  396. package/dist-browser/numbl-core/parser/ClassParser.d.ts +21 -0
  397. package/dist-browser/numbl-core/parser/CommandParser.d.ts +31 -0
  398. package/dist-browser/numbl-core/parser/ControlFlowParser.d.ts +16 -0
  399. package/dist-browser/numbl-core/parser/ExpressionParser.d.ts +32 -0
  400. package/dist-browser/numbl-core/parser/FunctionParser.d.ts +10 -0
  401. package/dist-browser/numbl-core/parser/Parser.d.ts +17 -0
  402. package/dist-browser/numbl-core/parser/ParserBase.d.ts +35 -0
  403. package/dist-browser/numbl-core/parser/StatementParser.d.ts +13 -0
  404. package/dist-browser/numbl-core/parser/errors.d.ts +15 -0
  405. package/dist-browser/numbl-core/parser/index.d.ts +7 -0
  406. package/dist-browser/numbl-core/parser/types.d.ts +342 -0
  407. package/dist-browser/numbl-core/runtime/alloc.d.ts +12 -0
  408. package/dist-browser/numbl-core/runtime/axisCommand.d.ts +34 -0
  409. package/dist-browser/numbl-core/runtime/compare.d.ts +5 -0
  410. package/dist-browser/numbl-core/runtime/constructors.d.ts +39 -0
  411. package/dist-browser/numbl-core/runtime/convert.d.ts +10 -0
  412. package/dist-browser/numbl-core/runtime/cow.d.ts +33 -0
  413. package/dist-browser/numbl-core/runtime/display.d.ts +6 -0
  414. package/dist-browser/numbl-core/runtime/error.d.ts +78 -0
  415. package/dist-browser/numbl-core/runtime/index.d.ts +13 -0
  416. package/dist-browser/numbl-core/runtime/indexing.d.ts +28 -0
  417. package/dist-browser/numbl-core/runtime/plotBuiltinDispatch.d.ts +92 -0
  418. package/dist-browser/numbl-core/runtime/plotUtils.d.ts +336 -0
  419. package/dist-browser/numbl-core/runtime/refcount.d.ts +85 -0
  420. package/dist-browser/numbl-core/runtime/runtime.d.ts +354 -0
  421. package/dist-browser/numbl-core/runtime/runtimeDispatch.d.ts +27 -0
  422. package/dist-browser/numbl-core/runtime/runtimeHelpers.d.ts +31 -0
  423. package/dist-browser/numbl-core/runtime/runtimeIndexing.d.ts +28 -0
  424. package/dist-browser/numbl-core/runtime/runtimeMemberAccess.d.ts +26 -0
  425. package/dist-browser/numbl-core/runtime/runtimeOperators.d.ts +24 -0
  426. package/dist-browser/numbl-core/runtime/runtimePlot.d.ts +129 -0
  427. package/dist-browser/numbl-core/runtime/sentinels.d.ts +4 -0
  428. package/dist-browser/numbl-core/runtime/specialBuiltinNames.d.ts +2 -0
  429. package/dist-browser/numbl-core/runtime/specialBuiltins.d.ts +13 -0
  430. package/dist-browser/numbl-core/runtime/struct-access.d.ts +11 -0
  431. package/dist-browser/numbl-core/runtime/syncChannel.d.ts +1 -0
  432. package/dist-browser/numbl-core/runtime/tensor-construction.d.ts +10 -0
  433. package/dist-browser/numbl-core/runtime/types.d.ts +197 -0
  434. package/dist-browser/numbl-core/runtime/uihtmlSession.d.ts +40 -0
  435. package/dist-browser/numbl-core/runtime/utils.d.ts +19 -0
  436. package/dist-browser/numbl-core/stdlib-bundle.d.ts +3 -0
  437. package/dist-browser/numbl-core/systemAdapter.d.ts +23 -0
  438. package/dist-browser/numbl-core/version.d.ts +2 -0
  439. package/dist-browser/numbl-core/workspace/index.d.ts +4 -0
  440. package/dist-browser/numbl-core/workspace/types.d.ts +24 -0
  441. package/dist-browser/ts-lapack/src/BLAS/daxpy.d.ts +1 -0
  442. package/dist-browser/ts-lapack/src/BLAS/dcopy.d.ts +1 -0
  443. package/dist-browser/ts-lapack/src/BLAS/ddot.d.ts +1 -0
  444. package/dist-browser/ts-lapack/src/BLAS/dgemm.d.ts +1 -0
  445. package/dist-browser/ts-lapack/src/BLAS/dgemm_optimized.d.ts +1 -0
  446. package/dist-browser/ts-lapack/src/BLAS/dgemv.d.ts +1 -0
  447. package/dist-browser/ts-lapack/src/BLAS/dger.d.ts +1 -0
  448. package/dist-browser/ts-lapack/src/BLAS/dnrm2.d.ts +1 -0
  449. package/dist-browser/ts-lapack/src/BLAS/drot.d.ts +1 -0
  450. package/dist-browser/ts-lapack/src/BLAS/dscal.d.ts +1 -0
  451. package/dist-browser/ts-lapack/src/BLAS/dswap.d.ts +1 -0
  452. package/dist-browser/ts-lapack/src/BLAS/dtrmm.d.ts +1 -0
  453. package/dist-browser/ts-lapack/src/BLAS/dtrmv.d.ts +1 -0
  454. package/dist-browser/ts-lapack/src/BLAS/dtrsm.d.ts +1 -0
  455. package/dist-browser/ts-lapack/src/BLAS/idamax.d.ts +1 -0
  456. package/dist-browser/ts-lapack/src/SRC/dbdsqr.d.ts +10 -0
  457. package/dist-browser/ts-lapack/src/SRC/dgebak.d.ts +1 -0
  458. package/dist-browser/ts-lapack/src/SRC/dgebal.d.ts +5 -0
  459. package/dist-browser/ts-lapack/src/SRC/dgebd2.d.ts +1 -0
  460. package/dist-browser/ts-lapack/src/SRC/dgebrd.d.ts +1 -0
  461. package/dist-browser/ts-lapack/src/SRC/dgeev.d.ts +3 -0
  462. package/dist-browser/ts-lapack/src/SRC/dgehd2.d.ts +1 -0
  463. package/dist-browser/ts-lapack/src/SRC/dgehrd.d.ts +1 -0
  464. package/dist-browser/ts-lapack/src/SRC/dgelq2.d.ts +1 -0
  465. package/dist-browser/ts-lapack/src/SRC/dgelqf.d.ts +1 -0
  466. package/dist-browser/ts-lapack/src/SRC/dgeqr2.d.ts +1 -0
  467. package/dist-browser/ts-lapack/src/SRC/dgeqrf.d.ts +1 -0
  468. package/dist-browser/ts-lapack/src/SRC/dgeqrf_optimized.d.ts +1 -0
  469. package/dist-browser/ts-lapack/src/SRC/dgesvd.d.ts +28 -0
  470. package/dist-browser/ts-lapack/src/SRC/dgetrf.d.ts +1 -0
  471. package/dist-browser/ts-lapack/src/SRC/dgetrf2.d.ts +1 -0
  472. package/dist-browser/ts-lapack/src/SRC/dgetri.d.ts +1 -0
  473. package/dist-browser/ts-lapack/src/SRC/dhseqr.d.ts +32 -0
  474. package/dist-browser/ts-lapack/src/SRC/dlabrd.d.ts +1 -0
  475. package/dist-browser/ts-lapack/src/SRC/dlacpy.d.ts +18 -0
  476. package/dist-browser/ts-lapack/src/SRC/dladiv.d.ts +9 -0
  477. package/dist-browser/ts-lapack/src/SRC/dlaexc.d.ts +21 -0
  478. package/dist-browser/ts-lapack/src/SRC/dlahqr.d.ts +24 -0
  479. package/dist-browser/ts-lapack/src/SRC/dlahr2.d.ts +1 -0
  480. package/dist-browser/ts-lapack/src/SRC/dlaln2.d.ts +5 -0
  481. package/dist-browser/ts-lapack/src/SRC/dlamch.d.ts +1 -0
  482. package/dist-browser/ts-lapack/src/SRC/dlange.d.ts +1 -0
  483. package/dist-browser/ts-lapack/src/SRC/dlanv2.d.ts +12 -0
  484. package/dist-browser/ts-lapack/src/SRC/dlapy2.d.ts +1 -0
  485. package/dist-browser/ts-lapack/src/SRC/dlaqr1.d.ts +1 -0
  486. package/dist-browser/ts-lapack/src/SRC/dlaqr30.d.ts +81 -0
  487. package/dist-browser/ts-lapack/src/SRC/dlaqr5.d.ts +38 -0
  488. package/dist-browser/ts-lapack/src/SRC/dlarf.d.ts +18 -0
  489. package/dist-browser/ts-lapack/src/SRC/dlarf1f.d.ts +1 -0
  490. package/dist-browser/ts-lapack/src/SRC/dlarfb.d.ts +25 -0
  491. package/dist-browser/ts-lapack/src/SRC/dlarfg.d.ts +4 -0
  492. package/dist-browser/ts-lapack/src/SRC/dlarft.d.ts +20 -0
  493. package/dist-browser/ts-lapack/src/SRC/dlarfx.d.ts +17 -0
  494. package/dist-browser/ts-lapack/src/SRC/dlartg.d.ts +5 -0
  495. package/dist-browser/ts-lapack/src/SRC/dlas2.d.ts +4 -0
  496. package/dist-browser/ts-lapack/src/SRC/dlascl.d.ts +1 -0
  497. package/dist-browser/ts-lapack/src/SRC/dlaset.d.ts +19 -0
  498. package/dist-browser/ts-lapack/src/SRC/dlasr.d.ts +1 -0
  499. package/dist-browser/ts-lapack/src/SRC/dlassq.d.ts +18 -0
  500. package/dist-browser/ts-lapack/src/SRC/dlasv2.d.ts +8 -0
  501. package/dist-browser/ts-lapack/src/SRC/dlaswp.d.ts +1 -0
  502. package/dist-browser/ts-lapack/src/SRC/dlasy2.d.ts +5 -0
  503. package/dist-browser/ts-lapack/src/SRC/dorg2r.d.ts +1 -0
  504. package/dist-browser/ts-lapack/src/SRC/dorgbr.d.ts +1 -0
  505. package/dist-browser/ts-lapack/src/SRC/dorghr.d.ts +1 -0
  506. package/dist-browser/ts-lapack/src/SRC/dorgl2.d.ts +1 -0
  507. package/dist-browser/ts-lapack/src/SRC/dorglq.d.ts +1 -0
  508. package/dist-browser/ts-lapack/src/SRC/dorgqr.d.ts +1 -0
  509. package/dist-browser/ts-lapack/src/SRC/dorgqr_optimized.d.ts +1 -0
  510. package/dist-browser/ts-lapack/src/SRC/dorm2r.d.ts +1 -0
  511. package/dist-browser/ts-lapack/src/SRC/dormhr.d.ts +1 -0
  512. package/dist-browser/ts-lapack/src/SRC/dormqr.d.ts +1 -0
  513. package/dist-browser/ts-lapack/src/SRC/dpotf2.d.ts +1 -0
  514. package/dist-browser/ts-lapack/src/SRC/dtrevc3.d.ts +27 -0
  515. package/dist-browser/ts-lapack/src/SRC/dtrexc.d.ts +24 -0
  516. package/dist-browser/ts-lapack/src/SRC/dtrti2.d.ts +1 -0
  517. package/dist-browser/ts-lapack/src/SRC/dtrtri.d.ts +1 -0
  518. package/dist-browser/ts-lapack/src/utils/constants.d.ts +28 -0
  519. package/dist-browser/ts-lapack/src/utils/iladlc.d.ts +1 -0
  520. package/dist-browser/ts-lapack/src/utils/iladlr.d.ts +1 -0
  521. package/dist-browser/ts-lapack/src/utils/ilaenv.d.ts +1 -0
  522. package/dist-browser/ts-lapack/src/utils/xerbla.d.ts +1 -0
  523. package/dist-browser/vfs/BrowserFileIOAdapter.d.ts +60 -0
  524. package/dist-browser/vfs/BrowserSystemAdapter.d.ts +27 -0
  525. package/dist-browser/vfs/VirtualFileSystem.d.ts +66 -0
  526. package/dist-browser/vfs/syncVfsChanges.d.ts +23 -0
  527. package/dist-browser/vfs/unzipToFiles.d.ts +7 -0
  528. package/dist-cli/cli.js +1527 -205
  529. package/dist-lib/lib.d.ts +4 -0
  530. package/dist-lib/lib.js +2217 -199
  531. package/dist-lib/numbl-core/executors/jit/hostHelpers.d.ts +4 -0
  532. package/dist-lib/numbl-core/fileIOAdapter.d.ts +13 -0
  533. package/dist-lib/numbl-core/helpers/scanFormat.d.ts +11 -0
  534. package/dist-lib/numbl-core/jit/builtins/defs/logical/fieldnames.d.ts +2 -2
  535. package/dist-lib/numbl-core/jit/builtins/defs/math/rand.d.ts +2 -0
  536. package/dist-lib/numbl-core/jitDeclineDiagnostics.d.ts +32 -0
  537. package/dist-lib/numbl-core/jsUserFunctions.d.ts +13 -0
  538. package/dist-lib/numbl-core/runtime/constructors.d.ts +3 -1
  539. package/dist-lib/numbl-core/runtime/indexing.d.ts +3 -0
  540. package/dist-lib/numbl-core/runtime/runtime.d.ts +1 -0
  541. package/dist-lib/numbl-core/runtime/types.d.ts +15 -1
  542. package/dist-lib/numbl-core/runtime/utils.d.ts +3 -0
  543. package/dist-lib/numbl-core/version.d.ts +1 -1
  544. package/dist-lib/vfs/BrowserFileIOAdapter.d.ts +60 -0
  545. package/dist-lib/vfs/BrowserSystemAdapter.d.ts +27 -0
  546. package/dist-lib/vfs/VirtualFileSystem.d.ts +66 -0
  547. package/dist-site-viewer/assets/index-CT9HA1Pn.js +4831 -0
  548. package/dist-site-viewer/assets/numbl-worker-CYPflGmm.js +5246 -0
  549. package/dist-site-viewer/index.html +1 -1
  550. package/package.json +9 -3
  551. package/dist-site-viewer/assets/index-RucHpf4b.js +0 -4826
  552. package/dist-site-viewer/assets/numbl-worker-IO39kohI.js +0 -5228
package/dist-lib/lib.js CHANGED
@@ -110,6 +110,7 @@ var isRuntimeStructArray = (value) => typeof value === "object" && value !== nul
110
110
  var isRuntimeClassInstanceArray = (value) => typeof value === "object" && value !== null && value.kind === "class_instance_array";
111
111
  var isRuntimeSparseMatrix = (value) => typeof value === "object" && value !== null && value.kind === "sparse_matrix";
112
112
  var isRuntimeDictionary = (value) => typeof value === "object" && value !== null && value.kind === "dictionary";
113
+ var isRuntimeStringArray = (value) => typeof value === "object" && value !== null && value.kind === "string_array";
113
114
  var kstr = (value) => {
114
115
  if (isRuntimeNumber(value)) return "number";
115
116
  if (isRuntimeLogical(value)) return "logical";
@@ -128,6 +129,7 @@ var kstr = (value) => {
128
129
  if (isRuntimeStructArray(value)) return "struct array";
129
130
  if (isRuntimeSparseMatrix(value)) return "sparse matrix";
130
131
  if (isRuntimeDictionary(value)) return "dictionary";
132
+ if (isRuntimeStringArray(value)) return "string array";
131
133
  return "unknown";
132
134
  };
133
135
  var RuntimeTensor = class extends Refcounted {
@@ -159,6 +161,24 @@ var RuntimeChar = class extends Refcounted {
159
161
  this.shape = shape;
160
162
  }
161
163
  };
164
+ var RuntimeStringArray = class extends Refcounted {
165
+ kind = "string_array";
166
+ /** Elements in column-major order (plain JS strings). */
167
+ data;
168
+ /** 2-D shape [rows, cols]; data.length === rows*cols. A 1x1 string is
169
+ * normally represented as a primitive JS string, not a 1x1 array —
170
+ * use stringArrayValue() to build results so scalars collapse. */
171
+ shape;
172
+ constructor(data, shape) {
173
+ super();
174
+ this.data = data;
175
+ this.shape = shape;
176
+ }
177
+ };
178
+ function stringArrayValue(data, shape) {
179
+ if (data.length === 1 && shape[0] === 1 && shape[1] === 1) return data[0];
180
+ return new RuntimeStringArray(data, shape);
181
+ }
162
182
  var RuntimeCell = class extends Refcounted {
163
183
  kind = "cell";
164
184
  data;
@@ -613,6 +633,29 @@ function sub2ind(shape, subs) {
613
633
  }
614
634
  return idx;
615
635
  }
636
+ function matlabNumToString(n) {
637
+ if (n === Infinity) return "Inf";
638
+ if (n === -Infinity) return "-Inf";
639
+ if (isNaN(n)) return "NaN";
640
+ if (n === 0) return "0";
641
+ if (Number.isInteger(n)) return String(n);
642
+ const prec = 5;
643
+ const exp2 = Math.floor(Math.log10(Math.abs(n)));
644
+ let s;
645
+ if (exp2 < -4 || exp2 >= prec) {
646
+ s = n.toExponential(prec - 1);
647
+ const ePos = s.indexOf("e");
648
+ let mantissa = s.slice(0, ePos);
649
+ const expPart0 = s.slice(ePos);
650
+ if (mantissa.includes(".")) mantissa = mantissa.replace(/\.?0+$/, "");
651
+ const expPart = expPart0.replace(/([eE][+-])(\d)$/, "$10$2");
652
+ s = mantissa + expPart;
653
+ } else {
654
+ s = n.toPrecision(prec);
655
+ if (s.includes(".")) s = s.replace(/\.?0+$/, "");
656
+ }
657
+ return s;
658
+ }
616
659
 
617
660
  // src/numbl-core/runtime/convert.ts
618
661
  function toNumber(v) {
@@ -689,6 +732,11 @@ function toString(v) {
689
732
  switch (v.kind) {
690
733
  case "char":
691
734
  return v.value;
735
+ case "string_array":
736
+ if (v.data.length === 1) return v.data[0];
737
+ throw new RuntimeError(
738
+ "Expected a scalar text value, got a string array"
739
+ );
692
740
  default:
693
741
  throw new RuntimeError(`Cannot convert ${kstr(v)} to string`);
694
742
  }
@@ -748,6 +796,15 @@ var valuesAreEqual = (a, b) => {
748
796
  }
749
797
  case "dictionary":
750
798
  return a === b;
799
+ case "string_array": {
800
+ const sb = b;
801
+ if (a.shape[0] !== sb.shape[0] || a.shape[1] !== sb.shape[1])
802
+ return false;
803
+ for (let i = 0; i < a.data.length; i++) {
804
+ if (a.data[i] !== sb.data[i]) return false;
805
+ }
806
+ return true;
807
+ }
751
808
  default:
752
809
  return false;
753
810
  }
@@ -800,7 +857,34 @@ function displayValue(v) {
800
857
  return formatDictionary(v);
801
858
  case "class_instance_array":
802
859
  return ` ${v.shape[0]}x${v.shape[1]} ${v.className} array`;
860
+ case "string_array":
861
+ return formatStringArray(v);
862
+ }
863
+ }
864
+ function formatStringArray(v) {
865
+ const [rows, cols] = v.shape;
866
+ if (v.data.length === 0) {
867
+ return ` ${rows}x${cols} empty string array`;
868
+ }
869
+ const quoted = v.data.map((s) => `"${s}"`);
870
+ const widths = [];
871
+ for (let c = 0; c < cols; c++) {
872
+ let w = 0;
873
+ for (let r = 0; r < rows; r++) {
874
+ w = Math.max(w, quoted[c * rows + r].length);
875
+ }
876
+ widths.push(w);
877
+ }
878
+ const lines = [];
879
+ for (let r = 0; r < rows; r++) {
880
+ const parts = [];
881
+ for (let c = 0; c < cols; c++) {
882
+ const q = quoted[c * rows + r];
883
+ parts.push(c === cols - 1 ? q : q.padEnd(widths[c]));
884
+ }
885
+ lines.push(" " + parts.join(" "));
803
886
  }
887
+ return lines.join("\n");
804
888
  }
805
889
  var formatStructArray = (v) => {
806
890
  const elements = v.elements;
@@ -1115,6 +1199,10 @@ var RTV = {
1115
1199
  string(value) {
1116
1200
  return value;
1117
1201
  },
1202
+ /** String array (does NOT collapse 1x1 — use stringArrayValue for that). */
1203
+ stringArray(data, shape) {
1204
+ return new RuntimeStringArray(data, shape);
1205
+ },
1118
1206
  char(value) {
1119
1207
  return new RuntimeChar(value);
1120
1208
  },
@@ -22719,6 +22807,28 @@ function coerceToConcatString(v) {
22719
22807
  return null;
22720
22808
  }
22721
22809
  function mAdd(a, b) {
22810
+ if (isRuntimeStringArray(a) || isRuntimeStringArray(b)) {
22811
+ const sa = isRuntimeStringArray(a) ? a : null;
22812
+ const sb = isRuntimeStringArray(b) ? b : null;
22813
+ if (sa && sb) {
22814
+ if (sa.shape[0] !== sb.shape[0] || sa.shape[1] !== sb.shape[1]) {
22815
+ throw new RuntimeError("Array dimensions must match for string plus");
22816
+ }
22817
+ return stringArrayValue(
22818
+ sa.data.map((s, i) => s + sb.data[i]),
22819
+ sa.shape
22820
+ );
22821
+ }
22822
+ const arr = sa ?? sb;
22823
+ const other = coerceToConcatString(sa ? b : a);
22824
+ if (other === null) {
22825
+ throw new RuntimeError("Cannot concatenate this value with a string");
22826
+ }
22827
+ return stringArrayValue(
22828
+ arr.data.map((s) => sa ? s + other : other + s),
22829
+ arr.shape
22830
+ );
22831
+ }
22722
22832
  if (isRuntimeString(a) || isRuntimeString(b)) {
22723
22833
  const aStr = coerceToConcatString(a);
22724
22834
  const bStr = coerceToConcatString(b);
@@ -23225,12 +23335,24 @@ function transposeClassInstanceArray(v) {
23225
23335
  }
23226
23336
  return new RuntimeClassInstanceArray(v.className, out, [c, r]);
23227
23337
  }
23338
+ function transposeStringArray(v) {
23339
+ const [r, c] = v.shape;
23340
+ const out = new Array(r * c);
23341
+ for (let i = 0; i < r; i++) {
23342
+ for (let j = 0; j < c; j++) {
23343
+ out[i * c + j] = v.data[j * r + i];
23344
+ }
23345
+ }
23346
+ return stringArrayValue(out, [c, r]);
23347
+ }
23228
23348
  function mTranspose(v) {
23229
23349
  if (isRuntimeSparseMatrix(v)) return sparseTranspose(v);
23230
23350
  if (isRuntimeComplexNumber(v)) return v;
23231
23351
  if (isRuntimeNumber(v) || isRuntimeLogical(v)) return v;
23232
23352
  if (isRuntimeCell(v)) return transposeCellArray(v);
23233
23353
  if (isRuntimeChar(v)) return v;
23354
+ if (isRuntimeString(v)) return v;
23355
+ if (isRuntimeStringArray(v)) return transposeStringArray(v);
23234
23356
  if (isRuntimeClassInstance(v)) return v;
23235
23357
  if (isRuntimeClassInstanceArray(v)) return transposeClassInstanceArray(v);
23236
23358
  if (!isRuntimeTensor(v))
@@ -23243,6 +23365,8 @@ function mConjugateTranspose(v) {
23243
23365
  if (isRuntimeNumber(v) || isRuntimeLogical(v)) return v;
23244
23366
  if (isRuntimeCell(v)) return transposeCellArray(v);
23245
23367
  if (isRuntimeChar(v)) return v;
23368
+ if (isRuntimeString(v)) return v;
23369
+ if (isRuntimeStringArray(v)) return transposeStringArray(v);
23246
23370
  if (isRuntimeClassInstance(v)) return v;
23247
23371
  if (isRuntimeClassInstanceArray(v)) return transposeClassInstanceArray(v);
23248
23372
  if (!isRuntimeTensor(v))
@@ -23255,7 +23379,38 @@ function asStringPair(a, b) {
23255
23379
  if (isRuntimeChar(a) && isRuntimeString(b)) return [a.value, b];
23256
23380
  return null;
23257
23381
  }
23382
+ function textOperandElems(v) {
23383
+ if (isRuntimeString(v)) return { data: [v], shape: [1, 1] };
23384
+ if (isRuntimeChar(v)) {
23385
+ const rows = v.shape ? v.shape[0] : 1;
23386
+ if (rows > 1) return null;
23387
+ return { data: [v.value], shape: [1, 1] };
23388
+ }
23389
+ if (isRuntimeStringArray(v)) return { data: v.data, shape: v.shape };
23390
+ return null;
23391
+ }
23258
23392
  function stringComparisonOp(a, b, op) {
23393
+ if (isRuntimeStringArray(a) || isRuntimeStringArray(b)) {
23394
+ const ta = textOperandElems(a);
23395
+ const tb = textOperandElems(b);
23396
+ if (ta === null || tb === null) return null;
23397
+ const aScalar = ta.data.length === 1 && ta.shape[0] * ta.shape[1] === 1;
23398
+ const bScalar = tb.data.length === 1 && tb.shape[0] * tb.shape[1] === 1;
23399
+ if (!aScalar && !bScalar && (ta.shape[0] !== tb.shape[0] || ta.shape[1] !== tb.shape[1])) {
23400
+ throw new RuntimeError("Array dimensions must match for comparison");
23401
+ }
23402
+ const shape = aScalar ? tb.shape : ta.shape;
23403
+ const n = aScalar ? tb.data.length : ta.data.length;
23404
+ const out = allocFloat64Array(n);
23405
+ for (let i = 0; i < n; i++) {
23406
+ const x = aScalar ? ta.data[0] : ta.data[i];
23407
+ const y = bScalar ? tb.data[0] : tb.data[i];
23408
+ out[i] = op(x, y) ? 1 : 0;
23409
+ }
23410
+ const t = RTV.tensor(out, [shape[0], shape[1]]);
23411
+ t._isLogical = true;
23412
+ return t;
23413
+ }
23259
23414
  const pair = asStringPair(a, b);
23260
23415
  if (pair === null) return null;
23261
23416
  return RTV.logical(op(pair[0], pair[1]));
@@ -24638,6 +24793,68 @@ function indexIntoChar(base, indices) {
24638
24793
  }
24639
24794
  throw new RuntimeError("Char indexing supports 1 or 2 dimensions");
24640
24795
  }
24796
+ function stringArraySubscript(idx, extent) {
24797
+ if (isColonIndex(idx)) {
24798
+ return Array.from({ length: extent }, (_, i) => i);
24799
+ }
24800
+ if (isRuntimeTensor(idx)) {
24801
+ if (idx._isLogical) {
24802
+ const out = [];
24803
+ for (let i = 0; i < idx.data.length; i++)
24804
+ if (idx.data[i] !== 0) out.push(i);
24805
+ return out;
24806
+ }
24807
+ return Array.from(idx.data, (v) => Math.round(v) - 1);
24808
+ }
24809
+ if (isRuntimeLogical(idx)) return idx ? [0] : [];
24810
+ return [Math.round(toNumber(idx)) - 1];
24811
+ }
24812
+ function indexIntoStringArray(base, indices) {
24813
+ const [rows, cols] = base.shape;
24814
+ const total = base.data.length;
24815
+ if (indices.length === 2) {
24816
+ const ri = stringArraySubscript(indices[0], rows);
24817
+ const ci = stringArraySubscript(indices[1], cols);
24818
+ const out2 = [];
24819
+ for (const c of ci) {
24820
+ if (c < 0 || c >= cols)
24821
+ throw new RuntimeError("Index exceeds array bounds");
24822
+ for (const r of ri) {
24823
+ if (r < 0 || r >= rows)
24824
+ throw new RuntimeError("Index exceeds array bounds");
24825
+ out2.push(base.data[c * rows + r]);
24826
+ }
24827
+ }
24828
+ return stringArrayValue(out2, [ri.length, ci.length]);
24829
+ }
24830
+ if (indices.length !== 1) {
24831
+ throw new RuntimeError("String array indexing supports 1 or 2 subscripts");
24832
+ }
24833
+ const idx = indices[0];
24834
+ if (isColonIndex(idx)) {
24835
+ return stringArrayValue(base.data.slice(), [total, 1]);
24836
+ }
24837
+ const linear = stringArraySubscript(idx, total);
24838
+ const out = [];
24839
+ for (const i of linear) {
24840
+ if (i < 0 || i >= total)
24841
+ throw new RuntimeError("Index exceeds array bounds");
24842
+ out.push(base.data[i]);
24843
+ }
24844
+ let shape;
24845
+ if (rows === 1 || cols === 1) {
24846
+ shape = rows === 1 ? [1, out.length] : [out.length, 1];
24847
+ } else if (isRuntimeTensor(idx) && !idx._isLogical) {
24848
+ const is = idx.shape;
24849
+ const im = is.length >= 2 ? is[0] : 1;
24850
+ shape = [im, out.length / (im || 1)];
24851
+ } else if (isRuntimeTensor(idx) && idx._isLogical) {
24852
+ shape = [out.length, 1];
24853
+ } else {
24854
+ shape = [1, out.length];
24855
+ }
24856
+ return stringArrayValue(out, shape);
24857
+ }
24641
24858
  function indexIntoLogical(base, indices) {
24642
24859
  if (indices.length === 1) {
24643
24860
  const idx = indices[0];
@@ -24768,6 +24985,9 @@ function indexIntoRTValue(base, indices) {
24768
24985
  return base;
24769
24986
  }
24770
24987
  }
24988
+ if (isRuntimeStringArray(base)) {
24989
+ return indexIntoStringArray(base, indices);
24990
+ }
24771
24991
  if (isRuntimeLogical(base)) {
24772
24992
  return indexIntoLogical(base, indices);
24773
24993
  }
@@ -25589,26 +25809,18 @@ function horzcat(...values) {
25589
25809
  if (values.some((v) => isRuntimeCell(v))) {
25590
25810
  return cellCatAlongDim(values, 1);
25591
25811
  }
25812
+ if (values.some((v) => isRuntimeString(v) || isRuntimeStringArray(v))) {
25813
+ return stringCat(values, 1);
25814
+ }
25592
25815
  if (values.some((v) => isRuntimeChar(v))) {
25593
25816
  let result = "";
25594
25817
  for (const v of values) {
25595
25818
  if (isRuntimeChar(v)) result += v.value;
25596
- else if (isRuntimeString(v)) result += v;
25597
25819
  else if (isRuntimeNumber(v)) result += String.fromCharCode(Math.round(v));
25598
25820
  else throw new RuntimeError(`Cannot concatenate ${kstr(v)} into char`);
25599
25821
  }
25600
25822
  return RTV.char(result);
25601
25823
  }
25602
- if (values.some((v) => isRuntimeString(v) || isRuntimeChar(v))) {
25603
- let result = "";
25604
- for (const v of values) {
25605
- if (isRuntimeString(v)) result += v;
25606
- else if (isRuntimeChar(v)) result += v.value;
25607
- else if (isRuntimeNumber(v)) result += String(v);
25608
- else throw new RuntimeError(`Cannot concatenate ${v} into string`);
25609
- }
25610
- return RTV.string(result);
25611
- }
25612
25824
  if (values.some((v) => isRuntimeStruct(v) || isRuntimeStructArray(v))) {
25613
25825
  return structCat(values);
25614
25826
  }
@@ -25623,6 +25835,9 @@ function vertcat(...values) {
25623
25835
  if (values.some((v) => isRuntimeCell(v))) {
25624
25836
  return cellCatAlongDim(values, 0);
25625
25837
  }
25838
+ if (values.some((v) => isRuntimeString(v) || isRuntimeStringArray(v))) {
25839
+ return stringCat(values, 0);
25840
+ }
25626
25841
  if (values.some((v) => isRuntimeChar(v))) {
25627
25842
  return vertcatChars(values);
25628
25843
  }
@@ -25631,6 +25846,86 @@ function vertcat(...values) {
25631
25846
  }
25632
25847
  return catAlongDim(values, 0);
25633
25848
  }
25849
+ function toStringBlock(v) {
25850
+ if (isRuntimeString(v)) return { data: [v], rows: 1, cols: 1 };
25851
+ if (isRuntimeStringArray(v)) {
25852
+ if (v.data.length === 0) return null;
25853
+ return { data: v.data.slice(), rows: v.shape[0], cols: v.shape[1] };
25854
+ }
25855
+ if (isRuntimeChar(v)) {
25856
+ const rows = v.shape ? v.shape[0] : 1;
25857
+ const width = v.shape ? v.shape[1] : v.value.length;
25858
+ if (rows <= 1) return { data: [v.value], rows: 1, cols: 1 };
25859
+ const out = [];
25860
+ for (let r = 0; r < rows; r++) {
25861
+ out.push(v.value.slice(r * width, (r + 1) * width));
25862
+ }
25863
+ return { data: out, rows, cols: 1 };
25864
+ }
25865
+ if (isRuntimeNumber(v)) {
25866
+ return { data: [matlabNumToString(v)], rows: 1, cols: 1 };
25867
+ }
25868
+ if (isRuntimeLogical(v)) {
25869
+ return { data: [v ? "true" : "false"], rows: 1, cols: 1 };
25870
+ }
25871
+ if (isRuntimeTensor(v)) {
25872
+ if (v.data.length === 0) return null;
25873
+ const rows = v.shape.length >= 2 ? v.shape[0] : 1;
25874
+ const cols = v.data.length / (rows || 1);
25875
+ const out = [];
25876
+ for (let i = 0; i < v.data.length; i++) {
25877
+ out.push(
25878
+ v._isLogical ? v.data[i] ? "true" : "false" : matlabNumToString(v.data[i])
25879
+ );
25880
+ }
25881
+ return { data: out, rows, cols };
25882
+ }
25883
+ throw new RuntimeError(`Cannot concatenate ${kstr(v)} into string array`);
25884
+ }
25885
+ function stringCat(values, dim) {
25886
+ const blocks = [];
25887
+ for (const v of values) {
25888
+ const b = toStringBlock(v);
25889
+ if (b) blocks.push(b);
25890
+ }
25891
+ if (blocks.length === 0) return RTV.stringArray([], [0, 0]);
25892
+ if (dim === 1) {
25893
+ const rows2 = blocks[0].rows;
25894
+ let cols2 = 0;
25895
+ for (const b of blocks) {
25896
+ if (b.rows !== rows2) {
25897
+ throw new RuntimeError(
25898
+ "Dimensions of arrays being concatenated are not consistent"
25899
+ );
25900
+ }
25901
+ cols2 += b.cols;
25902
+ }
25903
+ const data2 = [];
25904
+ for (const b of blocks) data2.push(...b.data);
25905
+ return stringArrayValue(data2, [rows2, cols2]);
25906
+ }
25907
+ const cols = blocks[0].cols;
25908
+ let rows = 0;
25909
+ for (const b of blocks) {
25910
+ if (b.cols !== cols) {
25911
+ throw new RuntimeError(
25912
+ "Dimensions of arrays being concatenated are not consistent"
25913
+ );
25914
+ }
25915
+ rows += b.rows;
25916
+ }
25917
+ const data = new Array(rows * cols);
25918
+ let rOff = 0;
25919
+ for (const b of blocks) {
25920
+ for (let c = 0; c < cols; c++) {
25921
+ for (let r = 0; r < b.rows; r++) {
25922
+ data[c * rows + rOff + r] = b.data[c * b.rows + r];
25923
+ }
25924
+ }
25925
+ rOff += b.rows;
25926
+ }
25927
+ return stringArrayValue(data, [rows, cols]);
25928
+ }
25634
25929
  function vertcatChars(values) {
25635
25930
  let cols = null;
25636
25931
  let totalRows = 0;
@@ -29860,9 +30155,9 @@ var ExpressionParser = class extends ParserBase {
29860
30155
  if (this.consume(50 /* LParen */)) {
29861
30156
  const args = [];
29862
30157
  if (!this.consume(51 /* RParen */)) {
29863
- args.push(this.parseExpr());
30158
+ this.parseFuncArg(args);
29864
30159
  while (this.consume(47 /* Comma */)) {
29865
- args.push(this.parseExpr());
30160
+ this.parseFuncArg(args);
29866
30161
  }
29867
30162
  if (!this.consume(51 /* RParen */)) {
29868
30163
  throw this.error("expected ')' after method arguments");
@@ -29891,9 +30186,9 @@ var ExpressionParser = class extends ParserBase {
29891
30186
  }
29892
30187
  const args = [];
29893
30188
  if (!this.consume(51 /* RParen */)) {
29894
- args.push(this.parseExpr());
30189
+ this.parseFuncArg(args);
29895
30190
  while (this.consume(47 /* Comma */)) {
29896
- args.push(this.parseExpr());
30191
+ this.parseFuncArg(args);
29897
30192
  }
29898
30193
  if (!this.consume(51 /* RParen */)) {
29899
30194
  throw this.error("expected ')' after super call arguments");
@@ -30740,13 +31035,8 @@ var FunctionParser = class extends ArgumentsParser {
30740
31035
  }
30741
31036
  }
30742
31037
  const vararginIdx = params.indexOf("varargin");
30743
- if (vararginIdx !== -1) {
30744
- if (vararginIdx !== params.length - 1) {
30745
- throw this.error("'varargin' must be the last input parameter");
30746
- }
30747
- if (params.filter((p2) => p2 === "varargin").length > 1) {
30748
- throw this.error("'varargin' cannot appear more than once");
30749
- }
31038
+ if (vararginIdx !== -1 && params.filter((p2) => p2 === "varargin").length > 1) {
31039
+ throw this.error("'varargin' cannot appear more than once");
30750
31040
  }
30751
31041
  const varargoutIdx = outputs.indexOf("varargout");
30752
31042
  if (varargoutIdx !== -1) {
@@ -30758,6 +31048,22 @@ var FunctionParser = class extends ArgumentsParser {
30758
31048
  }
30759
31049
  }
30760
31050
  const argumentsBlocks = this.parseArgumentsBlocks();
31051
+ if (vararginIdx !== -1 && vararginIdx !== params.length - 1) {
31052
+ const nvBases = /* @__PURE__ */ new Set();
31053
+ for (const block of argumentsBlocks) {
31054
+ if (block.kind === "Output" || block.kind === "OutputRepeating")
31055
+ continue;
31056
+ for (const e of block.entries) {
31057
+ const dot2 = e.name.indexOf(".");
31058
+ if (dot2 >= 0) nvBases.add(e.name.slice(0, dot2));
31059
+ }
31060
+ }
31061
+ for (const p2 of params.slice(vararginIdx + 1)) {
31062
+ if (!nvBases.has(p2)) {
31063
+ throw this.error("'varargin' must be the last input parameter");
31064
+ }
31065
+ }
31066
+ }
30761
31067
  const body = this.parseBlock((t) => t === 15 /* End */);
30762
31068
  if (!this.consume(15 /* End */)) {
30763
31069
  throw this.error("expected 'end'");
@@ -32170,6 +32476,16 @@ function forIter(v) {
32170
32476
  if (isRuntimeChar(mv)) {
32171
32477
  return Array.from(mv.value).map((c) => RTV.char(c));
32172
32478
  }
32479
+ if (isRuntimeStringArray(mv)) {
32480
+ const [rows, cols] = mv.shape;
32481
+ const out = [];
32482
+ for (let c = 0; c < cols; c++) {
32483
+ out.push(
32484
+ stringArrayValue(mv.data.slice(c * rows, (c + 1) * rows), [rows, 1])
32485
+ );
32486
+ }
32487
+ return out;
32488
+ }
32173
32489
  return [v];
32174
32490
  }
32175
32491
  function emptyTensor() {
@@ -34601,6 +34917,13 @@ function valuesEqualSimple(a, b) {
34601
34917
  }
34602
34918
  return true;
34603
34919
  }
34920
+ if (isRuntimeStringArray(a) && isRuntimeStringArray(b)) {
34921
+ if (a.shape[0] !== b.shape[0] || a.shape[1] !== b.shape[1]) return false;
34922
+ for (let i = 0; i < a.data.length; i++) {
34923
+ if (a.data[i] !== b.data[i]) return false;
34924
+ }
34925
+ return true;
34926
+ }
34604
34927
  return false;
34605
34928
  }
34606
34929
  function textValue(v) {
@@ -34873,6 +35196,7 @@ function getShape(v) {
34873
35196
  if (isRuntimeCell(v)) return v.shape;
34874
35197
  if (isRuntimeStructArray(v)) return [1, v.elements.length];
34875
35198
  if (isRuntimeClassInstanceArray(v)) return [...v.shape];
35199
+ if (isRuntimeStringArray(v)) return [...v.shape];
34876
35200
  return [1, 1];
34877
35201
  }
34878
35202
  defineBuiltin({
@@ -34928,7 +35252,11 @@ defineBuiltin({
34928
35252
  });
34929
35253
  defineBuiltin({
34930
35254
  name: "isstring",
34931
- cases: [anyToLogicalCase((args) => isRuntimeString(args[0]))]
35255
+ cases: [
35256
+ anyToLogicalCase(
35257
+ (args) => isRuntimeString(args[0]) || isRuntimeStringArray(args[0])
35258
+ )
35259
+ ]
34932
35260
  });
34933
35261
  var MATLAB_KEYWORDS = /* @__PURE__ */ new Set([
34934
35262
  "break",
@@ -35111,6 +35439,7 @@ defineBuiltin({
35111
35439
  if (isRuntimeString(v)) return false;
35112
35440
  if (isRuntimeStructArray(v)) return v.elements.length === 0;
35113
35441
  if (isRuntimeClassInstanceArray(v)) return v.elements.length === 0;
35442
+ if (isRuntimeStringArray(v)) return v.data.length === 0;
35114
35443
  return false;
35115
35444
  })
35116
35445
  ]
@@ -35165,6 +35494,7 @@ defineBuiltin({
35165
35494
  if (isRuntimeString(v)) return 1;
35166
35495
  if (isRuntimeStructArray(v)) return v.elements.length;
35167
35496
  if (isRuntimeClassInstanceArray(v)) return v.elements.length;
35497
+ if (isRuntimeStringArray(v)) return v.data.length;
35168
35498
  return 1;
35169
35499
  }
35170
35500
  }
@@ -35195,6 +35525,8 @@ defineBuiltin({
35195
35525
  if (isRuntimeStructArray(v)) return v.elements.length;
35196
35526
  if (isRuntimeClassInstanceArray(v))
35197
35527
  return v.elements.length === 0 ? 0 : Math.max(...v.shape);
35528
+ if (isRuntimeStringArray(v))
35529
+ return v.data.length === 0 ? 0 : Math.max(...v.shape);
35198
35530
  return 1;
35199
35531
  }
35200
35532
  }
@@ -35322,6 +35654,7 @@ defineBuiltin({
35322
35654
  return mkChar(v._isLogical ? "logical" : "double");
35323
35655
  if (isRuntimeSparseMatrix(v)) return mkChar("double");
35324
35656
  if (isRuntimeString(v)) return mkChar("string");
35657
+ if (isRuntimeStringArray(v)) return mkChar("string");
35325
35658
  if (isRuntimeChar(v)) return mkChar("char");
35326
35659
  if (isRuntimeStruct(v) || isRuntimeStructArray(v))
35327
35660
  return mkChar("struct");
@@ -35372,7 +35705,7 @@ function fieldnamesApply(args) {
35372
35705
  if (isRuntimeStructArray(v)) {
35373
35706
  const names2 = v.fieldNames;
35374
35707
  return RTV.cell(
35375
- names2.map((n) => RTV.string(n)),
35708
+ names2.map((n) => RTV.char(n)),
35376
35709
  [names2.length, 1]
35377
35710
  );
35378
35711
  }
@@ -35380,7 +35713,7 @@ function fieldnamesApply(args) {
35380
35713
  throw new RuntimeError("fieldnames: argument must be a struct");
35381
35714
  const names = [...v.fields.keys()];
35382
35715
  return RTV.cell(
35383
- names.map((n) => RTV.string(n)),
35716
+ names.map((n) => RTV.char(n)),
35384
35717
  [names.length, 1]
35385
35718
  );
35386
35719
  }
@@ -36457,6 +36790,87 @@ defineBuiltin({
36457
36790
  ]
36458
36791
  });
36459
36792
 
36793
+ // src/numbl-core/helpers/scanFormat.ts
36794
+ function scanFormat(str, fmt, maxCount) {
36795
+ const results = [];
36796
+ let strPos = 0;
36797
+ let fmtPos = 0;
36798
+ let matchFailure = false;
36799
+ while (fmtPos < fmt.length && strPos < str.length && results.length < maxCount) {
36800
+ if (fmt[fmtPos] === "%") {
36801
+ fmtPos++;
36802
+ if (fmtPos >= fmt.length) break;
36803
+ while (fmtPos < fmt.length && /[\d.]/.test(fmt[fmtPos])) fmtPos++;
36804
+ if (fmtPos >= fmt.length) break;
36805
+ const spec = fmt[fmtPos];
36806
+ fmtPos++;
36807
+ if (spec !== "c" && spec !== "s") {
36808
+ while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
36809
+ }
36810
+ if (spec === "d" || spec === "i" || spec === "u") {
36811
+ const m = str.slice(strPos).match(/^[+-]?\d+/);
36812
+ if (!m) {
36813
+ matchFailure = true;
36814
+ break;
36815
+ }
36816
+ results.push(parseInt(m[0], 10));
36817
+ strPos += m[0].length;
36818
+ } else if (spec === "f" || spec === "e" || spec === "g") {
36819
+ const m = str.slice(strPos).match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);
36820
+ if (!m) {
36821
+ matchFailure = true;
36822
+ break;
36823
+ }
36824
+ results.push(parseFloat(m[0]));
36825
+ strPos += m[0].length;
36826
+ } else if (spec === "x") {
36827
+ const m = str.slice(strPos).match(/^[+-]?[0-9a-fA-F]+/);
36828
+ if (!m) {
36829
+ matchFailure = true;
36830
+ break;
36831
+ }
36832
+ results.push(parseInt(m[0], 16));
36833
+ strPos += m[0].length;
36834
+ } else if (spec === "o") {
36835
+ const m = str.slice(strPos).match(/^[+-]?[0-7]+/);
36836
+ if (!m) {
36837
+ matchFailure = true;
36838
+ break;
36839
+ }
36840
+ results.push(parseInt(m[0], 8));
36841
+ strPos += m[0].length;
36842
+ } else if (spec === "c") {
36843
+ results.push(str.charCodeAt(strPos));
36844
+ strPos++;
36845
+ } else if (spec === "s") {
36846
+ const m = str.slice(strPos).match(/^\S+/);
36847
+ if (!m) {
36848
+ matchFailure = true;
36849
+ break;
36850
+ }
36851
+ for (let ci = 0; ci < m[0].length && results.length < maxCount; ci++) {
36852
+ results.push(m[0].charCodeAt(ci));
36853
+ }
36854
+ strPos += m[0].length;
36855
+ }
36856
+ } else if (/\s/.test(fmt[fmtPos])) {
36857
+ fmtPos++;
36858
+ while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
36859
+ } else {
36860
+ if (str[strPos] !== fmt[fmtPos]) {
36861
+ matchFailure = true;
36862
+ break;
36863
+ }
36864
+ strPos++;
36865
+ fmtPos++;
36866
+ }
36867
+ if (fmtPos >= fmt.length && results.length < maxCount && strPos < str.length) {
36868
+ fmtPos = 0;
36869
+ }
36870
+ }
36871
+ return { results, consumed: strPos, matchFailure };
36872
+ }
36873
+
36460
36874
  // src/numbl-core/interpreter/builtins/strings.ts
36461
36875
  function isTextType(t) {
36462
36876
  return t.kind === "char" || t.kind === "string";
@@ -36481,6 +36895,9 @@ function applyTextFn(v, fn) {
36481
36895
  return RTV.char(fn(v.value));
36482
36896
  }
36483
36897
  if (isRuntimeString(v)) return RTV.string(fn(toString(v)));
36898
+ if (isRuntimeStringArray(v)) {
36899
+ return RTV.stringArray(v.data.map(fn), [v.shape[0], v.shape[1]]);
36900
+ }
36484
36901
  return v;
36485
36902
  }
36486
36903
  function textPreserveResolve(fn) {
@@ -36493,6 +36910,16 @@ function textPreserveResolve(fn) {
36493
36910
  apply: (args) => applyTextFn(args[0], fn)
36494
36911
  };
36495
36912
  }
36913
+ if (t.kind === "unknown") {
36914
+ return {
36915
+ outputTypes: [{ kind: "unknown" }],
36916
+ apply: (args) => {
36917
+ if (!isRuntimeStringArray(args[0]))
36918
+ throw new RuntimeError("Expected a text input");
36919
+ return applyTextFn(args[0], fn);
36920
+ }
36921
+ };
36922
+ }
36496
36923
  const out = preserveTextType(t);
36497
36924
  if (!out) return null;
36498
36925
  return {
@@ -36582,17 +37009,14 @@ registerIBuiltin({
36582
37009
  name: "erase",
36583
37010
  resolve: (argTypes) => {
36584
37011
  if (argTypes.length !== 2) return null;
36585
- const out = preserveTextType(argTypes[0]);
37012
+ const out = argTypes[0].kind === "unknown" ? { kind: "unknown" } : preserveTextType(argTypes[0]);
36586
37013
  if (!out) return null;
36587
37014
  if (!isTextType(argTypes[1])) return null;
36588
37015
  return {
36589
37016
  outputTypes: [out],
36590
37017
  apply: (args) => {
36591
- const v = args[0];
36592
- const s = toString(v);
36593
37018
  const pat = toString(args[1]);
36594
- const result = s.split(pat).join("");
36595
- return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
37019
+ return applyTextFn(args[0], (s) => s.split(pat).join(""));
36596
37020
  }
36597
37021
  };
36598
37022
  }
@@ -36600,18 +37024,15 @@ registerIBuiltin({
36600
37024
  function strreplaceResolve() {
36601
37025
  return (argTypes) => {
36602
37026
  if (argTypes.length !== 3) return null;
36603
- const out = preserveTextType(argTypes[0]);
37027
+ const out = argTypes[0].kind === "unknown" || argTypes[0].kind === "cell" ? { kind: argTypes[0].kind } : preserveTextType(argTypes[0]);
36604
37028
  if (!out) return null;
36605
37029
  if (!isTextType(argTypes[1]) || !isTextType(argTypes[2])) return null;
36606
37030
  return {
36607
37031
  outputTypes: [out],
36608
37032
  apply: (args) => {
36609
- const v = args[0];
36610
- const s = toString(v);
36611
37033
  const old = toString(args[1]);
36612
37034
  const rep = toString(args[2]);
36613
- const result = s.split(old).join(rep);
36614
- return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
37035
+ return applyTextFn(args[0], (s) => s.split(old).join(rep));
36615
37036
  }
36616
37037
  };
36617
37038
  };
@@ -36779,9 +37200,16 @@ registerIBuiltin({
36779
37200
  function isText(v) {
36780
37201
  return isRuntimeChar(v) || isRuntimeString(v);
36781
37202
  }
37203
+ function stringArrayToCell(v) {
37204
+ if (!isRuntimeStringArray(v)) return v;
37205
+ return RTV.cell(
37206
+ v.data.map((s) => RTV.string(s)),
37207
+ [v.shape[0], v.shape[1]]
37208
+ );
37209
+ }
36782
37210
  function strcmpApply(args, cmp) {
36783
- const a = args[0];
36784
- const b = args[1];
37211
+ const a = stringArrayToCell(args[0]);
37212
+ const b = stringArrayToCell(args[1]);
36785
37213
  const aIsCell = isRuntimeCell(a);
36786
37214
  const bIsCell = isRuntimeCell(b);
36787
37215
  if (!aIsCell && !bIsCell) {
@@ -37027,24 +37455,43 @@ registerIBuiltin({
37027
37455
  };
37028
37456
  }
37029
37457
  });
37458
+ function patternList(pat) {
37459
+ if (isRuntimeCell(pat)) return pat.data.map((e) => toString(e));
37460
+ if (isRuntimeStringArray(pat)) return pat.data.slice();
37461
+ return [toString(pat)];
37462
+ }
37463
+ function textSubjectApply(subject, perElem) {
37464
+ if (isRuntimeStringArray(subject)) {
37465
+ return new RuntimeTensor(
37466
+ allocFloat64Array(subject.data.map((s) => perElem(s) ? 1 : 0)),
37467
+ [subject.shape[0], subject.shape[1]],
37468
+ void 0,
37469
+ true
37470
+ );
37471
+ }
37472
+ if (isRuntimeCell(subject)) {
37473
+ return new RuntimeTensor(
37474
+ allocFloat64Array(subject.data.map((e) => perElem(toString(e)) ? 1 : 0)),
37475
+ subject.shape.slice(),
37476
+ void 0,
37477
+ true
37478
+ );
37479
+ }
37480
+ return RTV.logical(perElem(toString(subject)));
37481
+ }
37482
+ function subjectTypeOk(t) {
37483
+ return isTextType(t) || t.kind === "cell" || t.kind === "unknown";
37484
+ }
37030
37485
  registerIBuiltin({
37031
37486
  name: "contains",
37032
37487
  resolve: (argTypes) => {
37033
37488
  if (argTypes.length < 2) return null;
37034
- if (!isTextType(argTypes[0])) return null;
37035
- if (argTypes[1].kind === "unknown") return null;
37489
+ if (!subjectTypeOk(argTypes[0])) return null;
37036
37490
  return {
37037
37491
  outputTypes: [{ kind: "boolean" }],
37038
37492
  apply: (args) => {
37039
- const s = toString(args[0]);
37040
- const pat = args[1];
37041
- if (isRuntimeCell(pat)) {
37042
- for (let i = 0; i < pat.data.length; i++) {
37043
- if (s.includes(toString(pat.data[i]))) return RTV.logical(true);
37044
- }
37045
- return RTV.logical(false);
37046
- }
37047
- return RTV.logical(s.includes(toString(pat)));
37493
+ const pats = patternList(args[1]);
37494
+ return textSubjectApply(args[0], (s) => pats.some((p2) => s.includes(p2)));
37048
37495
  }
37049
37496
  };
37050
37497
  }
@@ -37054,7 +37501,7 @@ function resolveStartsEndsWith(name, testFn) {
37054
37501
  name,
37055
37502
  resolve: (argTypes) => {
37056
37503
  if (argTypes.length < 2) return null;
37057
- if (!isTextType(argTypes[0])) return null;
37504
+ if (!subjectTypeOk(argTypes[0])) return null;
37058
37505
  return {
37059
37506
  outputTypes: [{ kind: "boolean" }],
37060
37507
  apply: (args) => {
@@ -37064,20 +37511,12 @@ function resolveStartsEndsWith(name, testFn) {
37064
37511
  ic = !!toNumber(args[i + 1]);
37065
37512
  }
37066
37513
  }
37067
- let s = toString(args[0]);
37068
- if (ic) s = s.toLowerCase();
37069
- const pat = args[1];
37070
- if (isRuntimeCell(pat)) {
37071
- for (let i = 0; i < pat.data.length; i++) {
37072
- let p3 = toString(pat.data[i]);
37073
- if (ic) p3 = p3.toLowerCase();
37074
- if (testFn(s, p3)) return RTV.logical(true);
37075
- }
37076
- return RTV.logical(false);
37077
- }
37078
- let p2 = toString(pat);
37079
- if (ic) p2 = p2.toLowerCase();
37080
- return RTV.logical(testFn(s, p2));
37514
+ let pats = patternList(args[1]);
37515
+ if (ic) pats = pats.map((p2) => p2.toLowerCase());
37516
+ return textSubjectApply(args[0], (s0) => {
37517
+ const s = ic ? s0.toLowerCase() : s0;
37518
+ return pats.some((p2) => testFn(s, p2));
37519
+ });
37081
37520
  }
37082
37521
  };
37083
37522
  }
@@ -37089,13 +37528,19 @@ registerIBuiltin({
37089
37528
  name: "strlength",
37090
37529
  resolve: (argTypes) => {
37091
37530
  if (argTypes.length !== 1) return null;
37092
- if (!isTextType(argTypes[0])) return null;
37531
+ if (!isTextType(argTypes[0]) && argTypes[0].kind !== "unknown") return null;
37093
37532
  return {
37094
37533
  outputTypes: [{ kind: "number", sign: "nonneg" }],
37095
37534
  apply: (args) => {
37096
37535
  const v = args[0];
37097
37536
  if (isRuntimeString(v)) return RTV.num(v.length);
37098
37537
  if (isRuntimeChar(v)) return RTV.num(v.value.length);
37538
+ if (isRuntimeStringArray(v)) {
37539
+ return RTV.tensor(allocFloat64Array(v.data.map((s) => s.length)), [
37540
+ v.shape[0],
37541
+ v.shape[1]
37542
+ ]);
37543
+ }
37099
37544
  throw new RuntimeError("strlength: argument must be a string or char");
37100
37545
  }
37101
37546
  };
@@ -37151,6 +37596,20 @@ registerIBuiltin({
37151
37596
  }
37152
37597
  };
37153
37598
  }
37599
+ if (t.kind === "unknown") {
37600
+ return {
37601
+ outputTypes: [{ kind: "tensor", isComplex: false }],
37602
+ apply: (args) => {
37603
+ const v = args[0];
37604
+ if (!isRuntimeStringArray(v))
37605
+ throw new RuntimeError("str2double: expected text input");
37606
+ return RTV.tensor(
37607
+ allocFloat64Array(v.data.map((s) => str2doubleScalar(s))),
37608
+ [v.shape[0], v.shape[1]]
37609
+ );
37610
+ }
37611
+ };
37612
+ }
37154
37613
  return null;
37155
37614
  }
37156
37615
  });
@@ -37336,29 +37795,7 @@ registerIBuiltin({
37336
37795
  };
37337
37796
  }
37338
37797
  });
37339
- function numStr2(n) {
37340
- if (n === Infinity) return "Inf";
37341
- if (n === -Infinity) return "-Inf";
37342
- if (isNaN(n)) return "NaN";
37343
- if (n === 0) return "0";
37344
- if (Number.isInteger(n)) return String(n);
37345
- const prec = 5;
37346
- const exp2 = Math.floor(Math.log10(Math.abs(n)));
37347
- let s;
37348
- if (exp2 < -4 || exp2 >= prec) {
37349
- s = n.toExponential(prec - 1);
37350
- const ePos = s.indexOf("e");
37351
- let mantissa = s.slice(0, ePos);
37352
- const expPart0 = s.slice(ePos);
37353
- if (mantissa.includes(".")) mantissa = mantissa.replace(/\.?0+$/, "");
37354
- const expPart = expPart0.replace(/([eE][+-])(\d)$/, "$10$2");
37355
- s = mantissa + expPart;
37356
- } else {
37357
- s = n.toPrecision(prec);
37358
- if (s.includes(".")) s = s.replace(/\.?0+$/, "");
37359
- }
37360
- return s;
37361
- }
37798
+ var numStr2 = matlabNumToString;
37362
37799
  registerIBuiltin({
37363
37800
  name: "num2str",
37364
37801
  resolve: (argTypes) => {
@@ -37569,7 +38006,7 @@ registerIBuiltin({
37569
38006
  resolve: (argTypes) => {
37570
38007
  if (argTypes.length !== 1) return null;
37571
38008
  const a = argTypes[0];
37572
- if (a.kind !== "char" && a.kind !== "string" && a.kind !== "number" && a.kind !== "tensor" && a.kind !== "cell")
38009
+ if (a.kind !== "char" && a.kind !== "string" && a.kind !== "number" && a.kind !== "tensor" && a.kind !== "cell" && a.kind !== "unknown")
37573
38010
  return null;
37574
38011
  return {
37575
38012
  outputTypes: [{ kind: "char" }],
@@ -37591,6 +38028,9 @@ registerIBuiltin({
37591
38028
  for (const el of v.data) rows.push(...valueToCharRows(el));
37592
38029
  return charRowsToMatrix(rows);
37593
38030
  }
38031
+ if (isRuntimeStringArray(v)) {
38032
+ return charRowsToMatrix(v.data.slice());
38033
+ }
37594
38034
  throw new RuntimeError("char: unsupported arguments");
37595
38035
  }
37596
38036
  };
@@ -37601,14 +38041,260 @@ registerIBuiltin({
37601
38041
  resolve: (argTypes) => {
37602
38042
  if (argTypes.length !== 1) return null;
37603
38043
  const a = argTypes[0];
37604
- if (a.kind === "unknown") return null;
38044
+ const scalarText = a.kind === "char" || a.kind === "string" || a.kind === "number" || a.kind === "boolean";
37605
38045
  return {
37606
- outputTypes: [{ kind: "string" }],
38046
+ outputTypes: [scalarText ? { kind: "string" } : { kind: "unknown" }],
37607
38047
  apply: (args) => {
38048
+ const v = args[0];
38049
+ if (isRuntimeString(v) || isRuntimeStringArray(v)) return v;
38050
+ if (isRuntimeChar(v)) {
38051
+ const rows = v.shape ? v.shape[0] : 1;
38052
+ if (rows <= 1) return RTV.string(v.value);
38053
+ const width = v.shape[1];
38054
+ const out = [];
38055
+ for (let r = 0; r < rows; r++) {
38056
+ out.push(v.value.slice(r * width, (r + 1) * width));
38057
+ }
38058
+ return RTV.stringArray(out, [rows, 1]);
38059
+ }
38060
+ if (isRuntimeNumber(v)) return RTV.string(numStr2(v));
38061
+ if (isRuntimeLogical(v)) return RTV.string(v ? "true" : "false");
38062
+ if (isRuntimeTensor(v)) {
38063
+ const rows = v.shape.length >= 2 ? v.shape[0] : 1;
38064
+ const cols = v.data.length === 0 ? v.shape[1] ?? 0 : v.data.length / (rows || 1);
38065
+ const out = [];
38066
+ for (let i = 0; i < v.data.length; i++) {
38067
+ out.push(
38068
+ v._isLogical ? v.data[i] ? "true" : "false" : numStr2(v.data[i])
38069
+ );
38070
+ }
38071
+ return stringArrayValue(out, [rows, cols]);
38072
+ }
38073
+ if (isRuntimeCell(v)) {
38074
+ const rows = v.shape.length >= 2 ? v.shape[0] : 1;
38075
+ const cols = v.data.length / (rows || 1);
38076
+ const out = v.data.map((el) => {
38077
+ const rv = ensureRuntimeValue(el);
38078
+ if (isRuntimeChar(rv)) return rv.value;
38079
+ if (isRuntimeString(rv)) return rv;
38080
+ if (isRuntimeNumber(rv)) return numStr2(rv);
38081
+ if (isRuntimeLogical(rv)) return rv ? "true" : "false";
38082
+ throw new RuntimeError(
38083
+ "string: cell elements must be text or numbers"
38084
+ );
38085
+ });
38086
+ return stringArrayValue(out, [rows, cols]);
38087
+ }
38088
+ return RTV.string(displayValue(v));
38089
+ }
38090
+ };
38091
+ }
38092
+ });
38093
+ registerIBuiltin({
38094
+ name: "strings",
38095
+ help: {
38096
+ signatures: ["strings", "strings(n)", "strings(m,n)", "strings([m n])"],
38097
+ description: 'Create a string array with every element set to "" (empty string).'
38098
+ },
38099
+ resolve: (argTypes) => {
38100
+ if (argTypes.some((t) => t.kind !== "number" && t.kind !== "tensor"))
38101
+ return null;
38102
+ return {
38103
+ outputTypes: [{ kind: "unknown" }],
38104
+ apply: (args) => {
38105
+ const dims = [];
38106
+ for (const a of args) {
38107
+ const rv = ensureRuntimeValue(a);
38108
+ if (isRuntimeTensor(rv)) {
38109
+ for (const d of rv.data) dims.push(Math.max(0, Math.round(d)));
38110
+ } else {
38111
+ dims.push(Math.max(0, Math.round(toNumber(rv))));
38112
+ }
38113
+ }
38114
+ if (dims.length === 0) dims.push(1, 1);
38115
+ if (dims.length === 1) dims.push(dims[0]);
38116
+ const m = dims[0];
38117
+ const n = dims.slice(1).reduce((a, b) => a * b, 1);
38118
+ return stringArrayValue(new Array(m * n).fill(""), [m, n]);
38119
+ }
38120
+ };
38121
+ }
38122
+ });
38123
+ registerIBuiltin({
38124
+ name: "newline",
38125
+ help: {
38126
+ signatures: ["newline"],
38127
+ description: "Newline character, char(10)."
38128
+ },
38129
+ resolve: (argTypes) => {
38130
+ if (argTypes.length !== 0) return null;
38131
+ return {
38132
+ outputTypes: [{ kind: "char" }],
38133
+ apply: () => RTV.char("\n")
38134
+ };
38135
+ }
38136
+ });
38137
+ registerIBuiltin({
38138
+ name: "split",
38139
+ help: {
38140
+ signatures: ["split(str)", "split(str, delimiter)"],
38141
+ description: "Split text at whitespace (or the given delimiter(s)) into a string array. A scalar input yields a column of parts."
38142
+ },
38143
+ resolve: (argTypes) => {
38144
+ if (argTypes.length < 1 || argTypes.length > 2) return null;
38145
+ const a = argTypes[0];
38146
+ if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
38147
+ return null;
38148
+ return {
38149
+ outputTypes: [{ kind: "unknown" }],
38150
+ apply: (args) => {
38151
+ const delims = args.length >= 2 ? patternList(args[1]) : null;
38152
+ const splitOne = (s) => {
38153
+ if (delims === null) {
38154
+ const trimmed = s.trim();
38155
+ return trimmed.length === 0 ? [""] : trimmed.split(/\s+/);
38156
+ }
38157
+ const escaped = delims.map((d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
38158
+ return s.split(new RegExp(escaped));
38159
+ };
38160
+ const v = args[0];
38161
+ const subjects = isRuntimeStringArray(v) ? v.data.slice() : isRuntimeCell(v) ? v.data.map((e) => toString(e)) : [toString(v)];
38162
+ const partsPer = subjects.map(splitOne);
38163
+ const nParts = partsPer[0].length;
38164
+ if (partsPer.some((p2) => p2.length !== nParts)) {
38165
+ throw new RuntimeError(
38166
+ "split: all elements must split into the same number of parts"
38167
+ );
38168
+ }
38169
+ if (subjects.length === 1) {
38170
+ return stringArrayValue(partsPer[0], [nParts, 1]);
38171
+ }
38172
+ const m = subjects.length;
38173
+ const out = new Array(m * nParts);
38174
+ for (let i = 0; i < m; i++) {
38175
+ for (let j = 0; j < nParts; j++) {
38176
+ out[j * m + i] = partsPer[i][j];
38177
+ }
38178
+ }
38179
+ return stringArrayValue(out, [m, nParts]);
38180
+ }
38181
+ };
38182
+ }
38183
+ });
38184
+ registerIBuiltin({
38185
+ name: "join",
38186
+ help: {
38187
+ signatures: ["join(str)", "join(str, delimiter)"],
38188
+ description: "Combine the elements of a string array into single strings, separated by a space (or the given delimiter)."
38189
+ },
38190
+ resolve: (argTypes) => {
38191
+ if (argTypes.length < 1 || argTypes.length > 2) return null;
38192
+ const a = argTypes[0];
38193
+ if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
38194
+ return null;
38195
+ return {
38196
+ outputTypes: [{ kind: "unknown" }],
38197
+ apply: (args) => {
38198
+ const delim = args.length >= 2 ? toString(args[1]) : " ";
37608
38199
  const v = args[0];
37609
38200
  if (isRuntimeString(v)) return v;
37610
38201
  if (isRuntimeChar(v)) return RTV.string(v.value);
37611
- return RTV.string(displayValue(v));
38202
+ const elems = isRuntimeStringArray(v) ? v.data : isRuntimeCell(v) ? v.data.map((e) => toString(e)) : [toString(v)];
38203
+ const shape = isRuntimeStringArray(v) ? v.shape : [1, elems.length];
38204
+ const [m, n] = shape;
38205
+ if (m === 1 || n === 1) {
38206
+ return RTV.string(elems.join(delim));
38207
+ }
38208
+ const out = [];
38209
+ for (let r = 0; r < m; r++) {
38210
+ const parts = [];
38211
+ for (let c = 0; c < n; c++) parts.push(elems[c * m + r]);
38212
+ out.push(parts.join(delim));
38213
+ }
38214
+ return stringArrayValue(out, [m, 1]);
38215
+ }
38216
+ };
38217
+ }
38218
+ });
38219
+ registerIBuiltin({
38220
+ name: "cellstr",
38221
+ help: {
38222
+ signatures: ["cellstr(A)"],
38223
+ description: "Convert a string array, char array, or cell array of text to a cell array of character vectors."
38224
+ },
38225
+ resolve: (argTypes) => {
38226
+ if (argTypes.length !== 1) return null;
38227
+ const a = argTypes[0];
38228
+ if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
38229
+ return null;
38230
+ return {
38231
+ outputTypes: [{ kind: "cell" }],
38232
+ apply: (args) => {
38233
+ const v = args[0];
38234
+ if (isRuntimeCell(v)) {
38235
+ return RTV.cell(
38236
+ v.data.map((e) => RTV.char(toString(e))),
38237
+ [...v.shape]
38238
+ );
38239
+ }
38240
+ if (isRuntimeStringArray(v)) {
38241
+ return RTV.cell(
38242
+ v.data.map((s) => RTV.char(s)),
38243
+ [v.shape[0], v.shape[1]]
38244
+ );
38245
+ }
38246
+ if (isRuntimeString(v)) return RTV.cell([RTV.char(v)], [1, 1]);
38247
+ if (isRuntimeChar(v)) {
38248
+ const rows = v.shape ? v.shape[0] : 1;
38249
+ if (rows <= 1) {
38250
+ return RTV.cell([RTV.char(v.value.replace(/\s+$/, ""))], [1, 1]);
38251
+ }
38252
+ const width = v.shape[1];
38253
+ const out = [];
38254
+ for (let r = 0; r < rows; r++) {
38255
+ out.push(
38256
+ RTV.char(
38257
+ v.value.slice(r * width, (r + 1) * width).replace(/\s+$/, "")
38258
+ )
38259
+ );
38260
+ }
38261
+ return RTV.cell(out, [rows, 1]);
38262
+ }
38263
+ throw new RuntimeError("cellstr: unsupported argument");
38264
+ }
38265
+ };
38266
+ }
38267
+ });
38268
+ registerIBuiltin({
38269
+ name: "ismissing",
38270
+ help: {
38271
+ signatures: ["ismissing(A)"],
38272
+ description: "Logical array marking missing elements. numbl has no <missing> value, so string inputs return all-false."
38273
+ },
38274
+ resolve: (argTypes) => {
38275
+ if (argTypes.length !== 1) return null;
38276
+ return {
38277
+ outputTypes: [{ kind: "boolean" }],
38278
+ apply: (args) => {
38279
+ const v = args[0];
38280
+ if (isRuntimeStringArray(v)) {
38281
+ const t = RTV.tensor(allocFloat64Array(v.data.length), [
38282
+ v.shape[0],
38283
+ v.shape[1]
38284
+ ]);
38285
+ t._isLogical = true;
38286
+ return t;
38287
+ }
38288
+ if (isRuntimeTensor(v)) {
38289
+ const t = RTV.tensor(
38290
+ allocFloat64Array(v.data.map((x) => isNaN(x) ? 1 : 0)),
38291
+ [...v.shape]
38292
+ );
38293
+ t._isLogical = true;
38294
+ return t;
38295
+ }
38296
+ if (isRuntimeNumber(v)) return RTV.logical(isNaN(v));
38297
+ return RTV.logical(false);
37612
38298
  }
37613
38299
  };
37614
38300
  }
@@ -37645,7 +38331,10 @@ registerIBuiltin({
37645
38331
  outputTypes: [outType],
37646
38332
  apply: (args) => {
37647
38333
  const fmt = toString(args[0]);
37648
- const result = sprintfFormat(fmt, args.slice(1));
38334
+ const rest = args.slice(1).flatMap(
38335
+ (a) => isRuntimeStringArray(a) ? a.data.map((s) => RTV.string(s)) : [a]
38336
+ );
38337
+ const result = sprintfFormat(fmt, rest);
37649
38338
  return isChar5 ? RTV.char(result) : RTV.string(result);
37650
38339
  }
37651
38340
  };
@@ -37666,80 +38355,11 @@ registerIBuiltin({
37666
38355
  const str = toString(args[0]);
37667
38356
  const fmt = toString(args[1]);
37668
38357
  const maxCount = args.length >= 3 ? toNumber(args[2]) : Infinity;
37669
- const results = [];
37670
- let strPos = 0;
37671
- let fmtPos = 0;
37672
- let matchFailure = false;
37673
- while (fmtPos < fmt.length && strPos < str.length && results.length < maxCount) {
37674
- if (fmt[fmtPos] === "%") {
37675
- fmtPos++;
37676
- if (fmtPos >= fmt.length) break;
37677
- const spec = fmt[fmtPos];
37678
- fmtPos++;
37679
- if (spec !== "c" && spec !== "s") {
37680
- while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
37681
- }
37682
- if (spec === "d" || spec === "i") {
37683
- const m = str.slice(strPos).match(/^[+-]?\d+/);
37684
- if (!m) {
37685
- matchFailure = true;
37686
- break;
37687
- }
37688
- results.push(parseInt(m[0], 10));
37689
- strPos += m[0].length;
37690
- } else if (spec === "f" || spec === "e" || spec === "g") {
37691
- const m = str.slice(strPos).match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);
37692
- if (!m) {
37693
- matchFailure = true;
37694
- break;
37695
- }
37696
- results.push(parseFloat(m[0]));
37697
- strPos += m[0].length;
37698
- } else if (spec === "x") {
37699
- const m = str.slice(strPos).match(/^[+-]?[0-9a-fA-F]+/);
37700
- if (!m) {
37701
- matchFailure = true;
37702
- break;
37703
- }
37704
- results.push(parseInt(m[0], 16));
37705
- strPos += m[0].length;
37706
- } else if (spec === "o") {
37707
- const m = str.slice(strPos).match(/^[+-]?[0-7]+/);
37708
- if (!m) {
37709
- matchFailure = true;
37710
- break;
37711
- }
37712
- results.push(parseInt(m[0], 8));
37713
- strPos += m[0].length;
37714
- } else if (spec === "c") {
37715
- results.push(str.charCodeAt(strPos));
37716
- strPos++;
37717
- } else if (spec === "s") {
37718
- const m = str.slice(strPos).match(/^\S+/);
37719
- if (!m) {
37720
- matchFailure = true;
37721
- break;
37722
- }
37723
- for (let ci = 0; ci < m[0].length && results.length < maxCount; ci++) {
37724
- results.push(m[0].charCodeAt(ci));
37725
- }
37726
- strPos += m[0].length;
37727
- }
37728
- } else if (/\s/.test(fmt[fmtPos])) {
37729
- fmtPos++;
37730
- while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
37731
- } else {
37732
- if (str[strPos] !== fmt[fmtPos]) {
37733
- matchFailure = true;
37734
- break;
37735
- }
37736
- strPos++;
37737
- fmtPos++;
37738
- }
37739
- if (fmtPos >= fmt.length && results.length < maxCount && strPos < str.length) {
37740
- fmtPos = 0;
37741
- }
37742
- }
38358
+ const {
38359
+ results,
38360
+ consumed: strPos,
38361
+ matchFailure
38362
+ } = scanFormat(str, fmt, maxCount);
37743
38363
  const vals = results.length === 1 ? RTV.num(results[0]) : RTV.tensor(allocFloat64Array(results), [results.length, 1]);
37744
38364
  if (nout >= 2) {
37745
38365
  const out = [vals, RTV.num(results.length)];
@@ -38018,6 +38638,10 @@ defineBuiltin({
38018
38638
  };
38019
38639
  return nargout > 1 ? [out, idx] : [out];
38020
38640
  }
38641
+ if (a.kind === "string" || a.kind === "unknown") {
38642
+ const out = { kind: "unknown" };
38643
+ return nargout > 1 ? [out, { kind: "unknown" }] : [out];
38644
+ }
38021
38645
  return null;
38022
38646
  },
38023
38647
  apply: (args, nargout) => {
@@ -38036,6 +38660,33 @@ defineBuiltin({
38036
38660
  if (args.length >= 3 && (isRuntimeString(args[2]) || isRuntimeChar(args[2]))) {
38037
38661
  descend = rstr(args[2]).toLowerCase() === "descend";
38038
38662
  }
38663
+ if (isRuntimeStringArray(v)) {
38664
+ const order = v.data.map((_, i) => i);
38665
+ order.sort((i, j) => {
38666
+ const x = v.data[i];
38667
+ const y = v.data[j];
38668
+ const c = x < y ? -1 : x > y ? 1 : 0;
38669
+ return descend ? -c : c;
38670
+ });
38671
+ const sorted = order.map((i) => v.data[i]);
38672
+ const isRow = v.shape[0] === 1;
38673
+ const shape = isRow ? [1, sorted.length] : [sorted.length, 1];
38674
+ const result = stringArrayValue(sorted, shape);
38675
+ if (nargout > 1) {
38676
+ return [
38677
+ result,
38678
+ RTV.tensor(allocFloat64Array(order.map((i) => i + 1)), [
38679
+ shape[0],
38680
+ shape[1]
38681
+ ])
38682
+ ];
38683
+ }
38684
+ return result;
38685
+ }
38686
+ if (isRuntimeString(v)) {
38687
+ if (nargout > 1) return [v, RTV.num(1)];
38688
+ return v;
38689
+ }
38039
38690
  if (isRuntimeNumber(v)) {
38040
38691
  if (nargout > 1) return [v, RTV.num(1)];
38041
38692
  return v;
@@ -38351,8 +39002,12 @@ var ismemberCases = [
38351
39002
  apply: (args, nargout) => {
38352
39003
  if (args.length < 2)
38353
39004
  throw new RuntimeError("ismember requires 2 arguments");
38354
- const v = args[0];
38355
- const b = args[1];
39005
+ const asCellstr = (x) => isRuntimeStringArray(x) ? RTV.cell(
39006
+ x.data.map((s) => RTV.string(s)),
39007
+ [x.shape[0], x.shape[1]]
39008
+ ) : x;
39009
+ const v = asCellstr(args[0]);
39010
+ const b = asCellstr(args[1]);
38356
39011
  const isStringLike = (x) => isRuntimeString(x) || isRuntimeChar(x);
38357
39012
  const isCellOfStrings = (x) => isRuntimeCell(x) && x.data.every(
38358
39013
  (e) => isRuntimeString(e) || isRuntimeChar(e)
@@ -38655,6 +39310,30 @@ defineBuiltin({
38655
39310
  )) {
38656
39311
  return uniqueCellOfStrings(v, nargout, stable);
38657
39312
  }
39313
+ if (isRuntimeStringArray(v)) {
39314
+ const elems = v.data;
39315
+ const seen = /* @__PURE__ */ new Map();
39316
+ for (let i = 0; i < elems.length; i++) {
39317
+ if (!seen.has(elems[i])) seen.set(elems[i], i);
39318
+ }
39319
+ let vals = [...seen.keys()];
39320
+ if (!stable) vals = vals.sort();
39321
+ const isRow = v.shape[0] === 1;
39322
+ const shape = isRow ? [1, vals.length] : [vals.length, 1];
39323
+ const result = stringArrayValue(vals, shape);
39324
+ if (nargout <= 1) return result;
39325
+ const ia = RTV.tensor(
39326
+ allocFloat64Array(vals.map((s) => seen.get(s) + 1)),
39327
+ [vals.length, 1]
39328
+ );
39329
+ if (nargout === 2) return [result, ia];
39330
+ const pos = new Map(vals.map((s, i) => [s, i + 1]));
39331
+ const ic = RTV.tensor(
39332
+ allocFloat64Array(elems.map((s) => pos.get(s))),
39333
+ [elems.length, 1]
39334
+ );
39335
+ return [result, ia, ic];
39336
+ }
38658
39337
  if (!isRuntimeTensor(v))
38659
39338
  throw new RuntimeError("unique: argument must be numeric");
38660
39339
  if (byRows) return uniqueByRows(v, nargout, stable);
@@ -41858,6 +42537,27 @@ function flipAlongDim(v, dimIdx) {
41858
42537
  }
41859
42538
  return RTV.tensor(result, [...shape], resultImag);
41860
42539
  }
42540
+ function flipCellAlongDim(v, dimIdx) {
42541
+ const shape = v.shape.length >= 2 ? v.shape : [1, v.shape[0] ?? v.data.length];
42542
+ const totalElems = v.data.length;
42543
+ const dimSize = dimIdx < shape.length ? shape[dimIdx] : 1;
42544
+ let strideDim = 1;
42545
+ for (let d = 0; d < dimIdx; d++) strideDim *= shape[d];
42546
+ const slabSize = strideDim * dimSize;
42547
+ const numOuter = totalElems / slabSize;
42548
+ const result = new Array(totalElems);
42549
+ for (let outer = 0; outer < numOuter; outer++) {
42550
+ const base = outer * slabSize;
42551
+ for (let k = 0; k < dimSize; k++) {
42552
+ const srcOff = base + k * strideDim;
42553
+ const dstOff = base + (dimSize - 1 - k) * strideDim;
42554
+ for (let i = 0; i < strideDim; i++) {
42555
+ result[dstOff + i] = v.data[srcOff + i];
42556
+ }
42557
+ }
42558
+ }
42559
+ return RTV.cell(result, [...shape]);
42560
+ }
41861
42561
  function flipSparse(v, dimIdx) {
41862
42562
  const isComplex = v.pi !== void 0;
41863
42563
  const nnz = v.jc[v.n];
@@ -42034,6 +42734,41 @@ defineBuiltin({
42034
42734
  chars[i2 * nc + j2] = linear[j2 * nr + i2];
42035
42735
  return new RuntimeChar(chars.join(""), [nr, nc]);
42036
42736
  }
42737
+ if (isRuntimeStringArray(v)) {
42738
+ const s = parseReshapeDims(args, v.data.length);
42739
+ while (s.length > 2 && s[s.length - 1] === 1) s.pop();
42740
+ if (s.length > 2)
42741
+ throw new RuntimeError("reshape: string arrays must be 2-D");
42742
+ const nr = s[0];
42743
+ const nc = s.length >= 2 ? s[1] : 1;
42744
+ return stringArrayValue(v.data.slice(), [nr, nc]);
42745
+ }
42746
+ if (isRuntimeString(v)) {
42747
+ parseReshapeDims(args, 1);
42748
+ return v;
42749
+ }
42750
+ if (isRuntimeClassInstanceArray(v)) {
42751
+ const total = v.elements.length;
42752
+ const s = parseReshapeDims(args, total);
42753
+ while (s.length > 2 && s[s.length - 1] === 1) s.pop();
42754
+ if (s.length > 2)
42755
+ throw new RuntimeError("reshape: object arrays must be 2-D");
42756
+ const nr = s[0];
42757
+ const nc = s.length >= 2 ? s[1] : 1;
42758
+ if (nr * nc !== total)
42759
+ throw new RuntimeError(
42760
+ "reshape: number of elements must not change"
42761
+ );
42762
+ return RTV.classInstanceArray(v.className, v.elements, [nr, nc]);
42763
+ }
42764
+ if (isRuntimeClassInstance(v)) {
42765
+ const s = parseReshapeDims(args, 1);
42766
+ if (s.reduce((a, b) => a * b, 1) !== 1)
42767
+ throw new RuntimeError(
42768
+ "reshape: number of elements must not change"
42769
+ );
42770
+ return v;
42771
+ }
42037
42772
  if (!isRuntimeTensor(v) && !isRuntimeNumber(v) && !isRuntimeComplexNumber(v))
42038
42773
  throw new RuntimeError("reshape: first argument must be numeric");
42039
42774
  const data = isRuntimeTensor(v) ? v.data : isRuntimeComplexNumber(v) ? allocFloat64Array([v.re]) : allocFloat64Array([v]);
@@ -42345,6 +43080,7 @@ defineBuiltin({
42345
43080
  if (isRuntimeChar(v))
42346
43081
  return RTV.char(v.value.split("").reverse().join(""));
42347
43082
  if (isRuntimeSparseMatrix(v)) return flipSparse(v, 1);
43083
+ if (isRuntimeCell(v)) return flipCellAlongDim(v, 1);
42348
43084
  if (!isRuntimeTensor(v))
42349
43085
  throw new RuntimeError("fliplr: argument must be numeric or char");
42350
43086
  return flipAlongDim(v, 1);
@@ -42365,6 +43101,7 @@ defineBuiltin({
42365
43101
  if (isRuntimeNumber(v)) return v;
42366
43102
  if (isRuntimeChar(v)) return v;
42367
43103
  if (isRuntimeSparseMatrix(v)) return flipSparse(v, 0);
43104
+ if (isRuntimeCell(v)) return flipCellAlongDim(v, 0);
42368
43105
  if (!isRuntimeTensor(v))
42369
43106
  throw new RuntimeError("flipud: argument must be numeric or char");
42370
43107
  return flipAlongDim(v, 0);
@@ -42383,8 +43120,8 @@ defineBuiltin({
42383
43120
  apply: (args) => {
42384
43121
  const v = args[0];
42385
43122
  if (isRuntimeNumber(v)) return v;
42386
- if (!isRuntimeTensor(v))
42387
- throw new RuntimeError("flip: argument must be numeric");
43123
+ if (!isRuntimeTensor(v) && !isRuntimeCell(v))
43124
+ throw new RuntimeError("flip: argument must be numeric or cell");
42388
43125
  let dimIdx = 0;
42389
43126
  if (args.length >= 2) {
42390
43127
  dimIdx = Math.round(toNumber(args[1])) - 1;
@@ -42393,7 +43130,7 @@ defineBuiltin({
42393
43130
  dimIdx = shape.findIndex((d) => d > 1);
42394
43131
  if (dimIdx === -1) dimIdx = 0;
42395
43132
  }
42396
- return flipAlongDim(v, dimIdx);
43133
+ return isRuntimeCell(v) ? flipCellAlongDim(v, dimIdx) : flipAlongDim(v, dimIdx);
42397
43134
  }
42398
43135
  }
42399
43136
  ]
@@ -44063,6 +44800,8 @@ function getValClassName(v) {
44063
44800
  return "double";
44064
44801
  case "dictionary":
44065
44802
  return "dictionary";
44803
+ case "string_array":
44804
+ return "string";
44066
44805
  default:
44067
44806
  return "unknown";
44068
44807
  }
@@ -44092,6 +44831,8 @@ function getShapeOf(v) {
44092
44831
  return [1, 1];
44093
44832
  case "struct_array":
44094
44833
  return [1, obj.elements.length];
44834
+ case "string_array":
44835
+ return [...obj.shape];
44095
44836
  default:
44096
44837
  return [1, 1];
44097
44838
  }
@@ -45759,6 +46500,12 @@ defineBuiltin({
45759
46500
  });
45760
46501
 
45761
46502
  // src/numbl-core/interpreter/builtins/type-constructors.ts
46503
+ function parseDoubleText(s) {
46504
+ const t = s.trim();
46505
+ if (t === "") return NaN;
46506
+ if (/^[+-]?inf(inity)?$/i.test(t)) return t[0] === "-" ? -Infinity : Infinity;
46507
+ return Number(t);
46508
+ }
45762
46509
  defineBuiltin({
45763
46510
  name: "double",
45764
46511
  cases: [
@@ -45766,7 +46513,7 @@ defineBuiltin({
45766
46513
  match: (argTypes) => {
45767
46514
  if (argTypes.length !== 1) return null;
45768
46515
  const a = argTypes[0];
45769
- if (a.kind === "number" || a.kind === "boolean" || a.kind === "char" || a.kind === "complex_or_number" || a.kind === "class_instance")
46516
+ if (a.kind === "number" || a.kind === "boolean" || a.kind === "char" || a.kind === "string" || a.kind === "unknown" || a.kind === "complex_or_number" || a.kind === "class_instance")
45770
46517
  return [{ kind: "number" }];
45771
46518
  if (a.kind === "tensor")
45772
46519
  return [
@@ -45788,6 +46535,13 @@ defineBuiltin({
45788
46535
  const codes = Array.from(v.value).map((c) => c.charCodeAt(0));
45789
46536
  return RTV.row(codes);
45790
46537
  }
46538
+ if (isRuntimeString(v)) return RTV.num(parseDoubleText(v));
46539
+ if (isRuntimeStringArray(v)) {
46540
+ return RTV.tensor(allocFloat64Array(v.data.map(parseDoubleText)), [
46541
+ v.shape[0],
46542
+ v.shape[1]
46543
+ ]);
46544
+ }
45791
46545
  if (isRuntimeLogical(v)) return RTV.num(v ? 1 : 0);
45792
46546
  if (isRuntimeNumber(v)) return v;
45793
46547
  if (isRuntimeComplexNumber(v)) return v.re;
@@ -46491,14 +47245,19 @@ registerIBuiltin({
46491
47245
  let delims;
46492
47246
  if (isRuntimeCell(args[1])) {
46493
47247
  delims = args[1].data.map((d) => toString(d));
47248
+ } else if (isRuntimeStringArray(args[1])) {
47249
+ delims = args[1].data.slice();
46494
47250
  } else {
46495
47251
  delims = [toString(args[1])];
46496
47252
  }
46497
47253
  const escaped = delims.map((d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
46498
47254
  parts = s.split(new RegExp("(?:" + escaped + ")+"));
46499
47255
  }
47256
+ if (isRuntimeString(args[0]) || isRuntimeStringArray(args[0])) {
47257
+ return stringArrayValue(parts, [1, parts.length]);
47258
+ }
46500
47259
  return RTV.cell(
46501
- parts.map((p2) => RTV.string(p2)),
47260
+ parts.map((p2) => RTV.char(p2)),
46502
47261
  [1, parts.length]
46503
47262
  );
46504
47263
  }
@@ -46512,11 +47271,18 @@ registerIBuiltin({
46512
47271
  return {
46513
47272
  outputTypes: [{ kind: "string" }],
46514
47273
  apply: (args) => {
46515
- if (!isRuntimeCell(args[0]))
47274
+ let elements;
47275
+ if (isRuntimeCell(args[0])) {
47276
+ elements = args[0].data.map((v) => toString(v));
47277
+ } else if (isRuntimeStringArray(args[0])) {
47278
+ elements = args[0].data.slice();
47279
+ } else if (isRuntimeString(args[0])) {
47280
+ elements = [args[0]];
47281
+ } else {
46516
47282
  throw new RuntimeError(
46517
- "strjoin: first argument must be a cell array"
47283
+ "strjoin: first argument must be a cell array or string array"
46518
47284
  );
46519
- const elements = args[0].data.map((v) => toString(v));
47285
+ }
46520
47286
  const delim = args.length >= 2 ? toString(args[1]) : " ";
46521
47287
  return RTV.string(elements.join(delim));
46522
47288
  }
@@ -46593,6 +47359,19 @@ function regexpImpl(caseSensitive, name, args, nargout) {
46593
47359
  [1, tokensList.length]
46594
47360
  );
46595
47361
  }
47362
+ if (mode === "split") {
47363
+ const splits = [];
47364
+ let prev = 0;
47365
+ for (let i = 0; i < starts.length; i++) {
47366
+ splits.push(str.slice(prev, starts[i] - 1));
47367
+ prev = ends[i];
47368
+ }
47369
+ splits.push(str.slice(prev));
47370
+ return RTV.cell(
47371
+ splits.map((s) => RTV.char(s)),
47372
+ [1, splits.length]
47373
+ );
47374
+ }
46596
47375
  if (mode === "names") {
46597
47376
  if (starts.length === 0) return RTV.tensor(allocFloat64Array(0), [0, 0]);
46598
47377
  const namedRe = new RegExp(pat, flags);
@@ -55036,6 +55815,7 @@ var SPECIAL_BUILTIN_NAMES = [
55036
55815
  "fclose",
55037
55816
  "fgetl",
55038
55817
  "fgets",
55818
+ "fscanf",
55039
55819
  "fileread",
55040
55820
  "feof",
55041
55821
  "ferror",
@@ -55132,6 +55912,8 @@ var SPECIAL_BUILTIN_NAMES = [
55132
55912
  "delete",
55133
55913
  "rmdir",
55134
55914
  "movefile",
55915
+ "copyfile",
55916
+ "fileattrib",
55135
55917
  "unzip",
55136
55918
  "dir",
55137
55919
  "warning",
@@ -55141,6 +55923,7 @@ var SPECIAL_BUILTIN_NAMES = [
55141
55923
  "userpath",
55142
55924
  "getenv",
55143
55925
  "setenv",
55926
+ "maxNumCompThreads",
55144
55927
  "pwd",
55145
55928
  "cd",
55146
55929
  "ode45",
@@ -55300,7 +56083,10 @@ function registerSpecialBuiltins(rt) {
55300
56083
  fmtIdx = 1;
55301
56084
  }
55302
56085
  const fmt = toString(margs[fmtIdx]);
55303
- output = sprintfFormat(fmt, margs.slice(fmtIdx + 1));
56086
+ const rest = margs.slice(fmtIdx + 1).flatMap(
56087
+ (a) => isRuntimeStringArray(a) ? a.data.map((s) => RTV.string(s)) : [a]
56088
+ );
56089
+ output = sprintfFormat(fmt, rest);
55304
56090
  if (fid === 1 || fid === 2) {
55305
56091
  rt.output(output);
55306
56092
  } else {
@@ -55454,6 +56240,53 @@ function registerSpecialBuiltins(rt) {
55454
56240
  const result = io.fgets(toNumber(margs[0]));
55455
56241
  return typeof result === "number" ? RTV.num(result) : RTV.char(result);
55456
56242
  });
56243
+ registerSpecial("fscanf", (nargout, args) => {
56244
+ const io = requireFileIO();
56245
+ const margs = args.map((a) => ensureRuntimeValue(a));
56246
+ if (margs.length < 2)
56247
+ throw new RuntimeError("fscanf requires at least 2 arguments");
56248
+ if (!io.ftell || !io.fseek || !io.freadBytes)
56249
+ throw new RuntimeError("fscanf is not supported in this environment");
56250
+ const fid = toNumber(margs[0]);
56251
+ const fmt = toString(margs[1]);
56252
+ let maxCount = Infinity;
56253
+ let rows = null;
56254
+ if (margs.length >= 3) {
56255
+ const sz = margs[2];
56256
+ if (isRuntimeTensor(sz) && sz.data.length >= 2) {
56257
+ rows = sz.data[0];
56258
+ maxCount = sz.data[0] * sz.data[1];
56259
+ } else {
56260
+ maxCount = toNumber(sz);
56261
+ }
56262
+ }
56263
+ const pos = io.ftell(fid);
56264
+ const CHUNK = 1 << 16;
56265
+ const chunks = [];
56266
+ for (; ; ) {
56267
+ const bytes = io.freadBytes(fid, CHUNK);
56268
+ let s = "";
56269
+ for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]);
56270
+ chunks.push(s);
56271
+ if (bytes.length < CHUNK) break;
56272
+ }
56273
+ const { results, consumed } = scanFormat(chunks.join(""), fmt, maxCount);
56274
+ io.fseek(fid, pos + consumed, -1);
56275
+ const n = results.length;
56276
+ let out;
56277
+ if (rows !== null && Number.isFinite(rows) && rows > 0) {
56278
+ const cols = Math.ceil(n / rows);
56279
+ const data = allocFloat64Array(rows * cols);
56280
+ for (let i = 0; i < n; i++) data[i] = results[i];
56281
+ out = RTV.tensor(data, [rows, cols]);
56282
+ } else if (n === 1) {
56283
+ out = RTV.num(results[0]);
56284
+ } else {
56285
+ out = RTV.tensor(allocFloat64Array(results), [n, 1]);
56286
+ }
56287
+ if (nargout >= 2) return [out, RTV.num(n)];
56288
+ return out;
56289
+ });
55457
56290
  registerSpecial("fileread", (_nargout, args) => {
55458
56291
  const io = requireFileIO();
55459
56292
  const margs = args.map((a) => ensureRuntimeValue(a));
@@ -56082,6 +56915,65 @@ function registerSpecialBuiltins(rt) {
56082
56915
  RTV.char("")
56083
56916
  ];
56084
56917
  });
56918
+ registerSpecial("copyfile", (nargout, args) => {
56919
+ const io = requireFileIO();
56920
+ if (!io.copyfile)
56921
+ throw new RuntimeError("copyfile is not available in this environment");
56922
+ const margs = args.map((a) => ensureRuntimeValue(a));
56923
+ if (margs.length < 1)
56924
+ throw new RuntimeError("copyfile requires at least 1 argument");
56925
+ const source = toString(margs[0]);
56926
+ const destination = margs.length >= 2 ? toString(margs[1]) : rt.system?.cwd() ?? ".";
56927
+ let force = false;
56928
+ if (margs.length >= 3) {
56929
+ const third = toString(margs[2]);
56930
+ if (third.toLowerCase() === "f") force = true;
56931
+ }
56932
+ const ok = io.copyfile(source, destination, force);
56933
+ if (nargout === 0) {
56934
+ if (!ok)
56935
+ throw new RuntimeError(
56936
+ `copyfile: cannot copy '${source}' to '${destination}'`
56937
+ );
56938
+ return void 0;
56939
+ }
56940
+ return nargout <= 1 ? RTV.num(ok ? 1 : 0) : [
56941
+ RTV.num(ok ? 1 : 0),
56942
+ RTV.char(ok ? "" : `Cannot copy '${source}' to '${destination}'`),
56943
+ RTV.char("")
56944
+ ];
56945
+ });
56946
+ registerSpecial("fileattrib", (nargout, args) => {
56947
+ const io = requireFileIO();
56948
+ if (!io.fileattrib)
56949
+ throw new RuntimeError("fileattrib is not available in this environment");
56950
+ const margs = args.map((a) => ensureRuntimeValue(a));
56951
+ if (margs.length < 1)
56952
+ throw new RuntimeError("fileattrib requires at least 1 argument");
56953
+ const p2 = toString(margs[0]);
56954
+ const info = io.fileattrib(p2);
56955
+ if (nargout === 0) {
56956
+ if (!info)
56957
+ throw new RuntimeError(
56958
+ `fileattrib: cannot find '${p2}': No such file or directory`
56959
+ );
56960
+ return void 0;
56961
+ }
56962
+ const values = info ? RTV.struct(
56963
+ /* @__PURE__ */ new Map([
56964
+ ["Name", RTV.char(info.Name)],
56965
+ ["archive", RTV.num(0)],
56966
+ ["system", RTV.num(0)],
56967
+ ["hidden", RTV.num(0)],
56968
+ ["directory", RTV.num(info.directory ? 1 : 0)],
56969
+ ["UserRead", RTV.num(info.UserRead ? 1 : 0)],
56970
+ ["UserWrite", RTV.num(info.UserWrite ? 1 : 0)],
56971
+ ["UserExecute", RTV.num(info.UserExecute ? 1 : 0)]
56972
+ ])
56973
+ ) : RTV.char(`No such file or directory: ${p2}`);
56974
+ if (nargout <= 1) return RTV.num(info ? 1 : 0);
56975
+ return [RTV.num(info ? 1 : 0), values, RTV.char("")];
56976
+ });
56085
56977
  registerSpecial("unzip", (nargout, args) => {
56086
56978
  const io = requireFileIO();
56087
56979
  if (!io.unzip)
@@ -56407,6 +57299,7 @@ function registerSpecialBuiltins(rt) {
56407
57299
  }
56408
57300
  return RTV.char(sys?.getEnv(toString(args[0])) ?? "");
56409
57301
  });
57302
+ registerSpecial("maxNumCompThreads", () => RTV.num(1));
56410
57303
  registerSpecialVoid("setenv", (args) => {
56411
57304
  const sys = rt.system;
56412
57305
  if (args.length === 2) {
@@ -57821,6 +58714,9 @@ function isa(rt, value, classNameArg) {
57821
58714
  case "class_instance_array":
57822
58715
  valueClass = mv.className;
57823
58716
  break;
58717
+ case "string_array":
58718
+ valueClass = "string";
58719
+ break;
57824
58720
  default:
57825
58721
  valueClass = "unknown";
57826
58722
  break;
@@ -58394,6 +59290,8 @@ function numblClass(v) {
58394
59290
  return "double";
58395
59291
  case "class_instance":
58396
59292
  return v.className;
59293
+ case "string_array":
59294
+ return "string";
58397
59295
  default:
58398
59296
  return "unknown";
58399
59297
  }
@@ -58563,6 +59461,10 @@ function endResolver(mv, numIndices) {
58563
59461
  }
58564
59462
  if (isRuntimeStructArray(mv)) return mv.elements.length;
58565
59463
  if (isRuntimeClassInstanceArray(mv)) return mv.elements.length;
59464
+ if (isRuntimeStringArray(mv)) {
59465
+ if (numIndices === 1) return mv.data.length;
59466
+ return dim < 2 ? mv.shape[dim] : 1;
59467
+ }
58566
59468
  if (isRuntimeSparseMatrix(mv)) {
58567
59469
  if (numIndices === 1) return mv.m * mv.n;
58568
59470
  return dim === 0 ? mv.m : dim === 1 ? mv.n : 1;
@@ -58849,6 +59751,28 @@ function indexCell(rt, base, indices) {
58849
59751
  if (isRuntimeCell(val) && val.data.length === 1) return val.data[0];
58850
59752
  return val;
58851
59753
  }
59754
+ if (isRuntimeString(mv) || isRuntimeStringArray(mv)) {
59755
+ const idxMvals2 = resolveIndices(indices, endResolver(mv, indices.length));
59756
+ const elems = isRuntimeString(mv) ? [mv] : mv.data;
59757
+ const shape = isRuntimeString(mv) ? [1, 1] : mv.shape;
59758
+ let lin;
59759
+ if (idxMvals2.length === 1) {
59760
+ lin = Math.round(toNumber(idxMvals2[0])) - 1;
59761
+ } else if (idxMvals2.length === 2) {
59762
+ const r = Math.round(toNumber(idxMvals2[0])) - 1;
59763
+ const c = Math.round(toNumber(idxMvals2[1])) - 1;
59764
+ if (r < 0 || r >= shape[0] || c < 0 || c >= shape[1])
59765
+ throw new RuntimeError("Index exceeds array bounds");
59766
+ lin = c * shape[0] + r;
59767
+ } else {
59768
+ throw new RuntimeError(
59769
+ "String brace indexing supports 1 or 2 subscripts"
59770
+ );
59771
+ }
59772
+ if (lin < 0 || lin >= elems.length)
59773
+ throw new RuntimeError("Index exceeds array bounds");
59774
+ return RTV.char(elems[lin]);
59775
+ }
58852
59776
  if (!isRuntimeCell(mv)) throw new RuntimeError("Cell indexing on non-cell");
58853
59777
  const idxMvals = resolveIndices(indices, endResolver(mv, indices.length));
58854
59778
  if (idxMvals.length === 1) {
@@ -59042,6 +59966,15 @@ function indexStore(rt, base, indices, rhs, skipSubsasgn = false) {
59042
59966
  return rhsMv2;
59043
59967
  }
59044
59968
  }
59969
+ {
59970
+ const rhsMv0 = ensureRuntimeValue(rhs);
59971
+ const baseIsStr = isRuntimeString(mv) || isRuntimeStringArray(mv);
59972
+ const baseEmpty = isRuntimeTensor(mv) && mv.data.length === 0;
59973
+ const rhsIsStr = isRuntimeString(rhsMv0) || isRuntimeStringArray(rhsMv0);
59974
+ if (baseIsStr || baseEmpty && rhsIsStr) {
59975
+ return stringArrayIndexStore(mv, indices, rhsMv0);
59976
+ }
59977
+ }
59045
59978
  let wasScalar = false;
59046
59979
  let wasChar = false;
59047
59980
  if (!isRuntimeTensor(mv)) {
@@ -59085,6 +60018,109 @@ function indexStore(rt, base, indices, rhs, skipSubsasgn = false) {
59085
60018
  }
59086
60019
  return result;
59087
60020
  }
60021
+ function rhsToStringElems(rhsMv) {
60022
+ if (isRuntimeString(rhsMv)) return [rhsMv];
60023
+ if (isRuntimeStringArray(rhsMv)) return rhsMv.data.slice();
60024
+ if (isRuntimeChar(rhsMv)) {
60025
+ const rows = rhsMv.shape ? rhsMv.shape[0] : 1;
60026
+ if (rows <= 1) return [rhsMv.value];
60027
+ const width = rhsMv.shape[1];
60028
+ const out = [];
60029
+ for (let r = 0; r < rows; r++)
60030
+ out.push(rhsMv.value.slice(r * width, (r + 1) * width));
60031
+ return out;
60032
+ }
60033
+ if (isRuntimeNumber(rhsMv)) return [matlabNumToString(rhsMv)];
60034
+ if (isRuntimeLogical(rhsMv)) return [rhsMv ? "true" : "false"];
60035
+ if (isRuntimeTensor(rhsMv))
60036
+ return Array.from(rhsMv.data, (d) => matlabNumToString(d));
60037
+ return null;
60038
+ }
60039
+ function stringArrayIndexStore(mv, indices, rhsMv) {
60040
+ let data;
60041
+ let rows;
60042
+ let cols;
60043
+ if (isRuntimeStringArray(mv)) {
60044
+ data = mv.data.slice();
60045
+ [rows, cols] = mv.shape;
60046
+ } else if (isRuntimeString(mv)) {
60047
+ data = [mv];
60048
+ rows = 1;
60049
+ cols = 1;
60050
+ } else {
60051
+ data = [];
60052
+ rows = 0;
60053
+ cols = 0;
60054
+ }
60055
+ const idxMvals = resolveIndices(indices, endResolver(mv, indices.length));
60056
+ if (isRuntimeTensor(rhsMv) && rhsMv.data.length === 0 && idxMvals.length === 1) {
60057
+ const del = new Set(stringArraySubscript(idxMvals[0], data.length));
60058
+ const kept = data.filter((_, i) => !del.has(i));
60059
+ if (cols === 1 && rows > 1) return stringArrayValue(kept, [kept.length, 1]);
60060
+ return stringArrayValue(kept, [1, kept.length]);
60061
+ }
60062
+ const rhsElems = rhsToStringElems(rhsMv);
60063
+ if (rhsElems === null) {
60064
+ throw new RuntimeError("Cannot assign this value into a string array");
60065
+ }
60066
+ if (idxMvals.length === 1) {
60067
+ const positions = stringArraySubscript(idxMvals[0], data.length);
60068
+ const maxPos = positions.length ? Math.max(...positions) : -1;
60069
+ if (positions.some((p2) => p2 < 0)) {
60070
+ throw new RuntimeError("Index must be a positive integer");
60071
+ }
60072
+ if (maxPos >= data.length) {
60073
+ if (rows > 1 && cols > 1) {
60074
+ throw new RuntimeError("Index exceeds array bounds");
60075
+ }
60076
+ while (data.length <= maxPos) data.push("");
60077
+ }
60078
+ if (rhsElems.length !== 1 && rhsElems.length !== positions.length) {
60079
+ throw new RuntimeError(
60080
+ "Unable to perform assignment because the left and right sides have a different number of elements"
60081
+ );
60082
+ }
60083
+ positions.forEach((p2, k) => {
60084
+ data[p2] = rhsElems.length === 1 ? rhsElems[0] : rhsElems[k];
60085
+ });
60086
+ if (rows > 1 && cols > 1) return stringArrayValue(data, [rows, cols]);
60087
+ if (cols === 1 && rows > 1) return stringArrayValue(data, [data.length, 1]);
60088
+ return stringArrayValue(data, [1, data.length]);
60089
+ }
60090
+ if (idxMvals.length === 2) {
60091
+ const ri = stringArraySubscript(idxMvals[0], rows);
60092
+ const ci = stringArraySubscript(idxMvals[1], cols);
60093
+ if (ri.some((p2) => p2 < 0) || ci.some((p2) => p2 < 0)) {
60094
+ throw new RuntimeError("Index must be a positive integer");
60095
+ }
60096
+ const newRows = Math.max(rows, ri.length ? Math.max(...ri) + 1 : 0);
60097
+ const newCols = Math.max(cols, ci.length ? Math.max(...ci) + 1 : 0);
60098
+ let grid = data;
60099
+ if (newRows !== rows || newCols !== cols) {
60100
+ grid = new Array(newRows * newCols).fill("");
60101
+ for (let c = 0; c < cols; c++) {
60102
+ for (let r = 0; r < rows; r++) {
60103
+ grid[c * newRows + r] = data[c * rows + r];
60104
+ }
60105
+ }
60106
+ }
60107
+ const count = ri.length * ci.length;
60108
+ if (rhsElems.length !== 1 && rhsElems.length !== count) {
60109
+ throw new RuntimeError(
60110
+ "Unable to perform assignment because the left and right sides have a different number of elements"
60111
+ );
60112
+ }
60113
+ let k = 0;
60114
+ for (const c of ci) {
60115
+ for (const r of ri) {
60116
+ grid[c * newRows + r] = rhsElems.length === 1 ? rhsElems[0] : rhsElems[k];
60117
+ k++;
60118
+ }
60119
+ }
60120
+ return stringArrayValue(grid, [newRows, newCols]);
60121
+ }
60122
+ throw new RuntimeError("String array assignment supports 1 or 2 subscripts");
60123
+ }
59088
60124
  function indexCellStore(base, indices, rhs, rt) {
59089
60125
  if (base === void 0 || base === null) base = RTV.cell([], [0, 0]);
59090
60126
  let mv = ensureRuntimeValue(base);
@@ -61298,6 +62334,7 @@ var Runtime = class _Runtime {
61298
62334
  if (isRuntimeChar(rv))
61299
62335
  return rv.shape ?? (rv.value.length === 0 ? [0, 0] : [1, rv.value.length]);
61300
62336
  if (isRuntimeString(rv)) return [1, 1];
62337
+ if (isRuntimeStringArray(rv)) return [...rv.shape];
61301
62338
  if (isRuntimeClassInstance(rv)) return [1, 1];
61302
62339
  return [1, 1];
61303
62340
  }
@@ -62056,6 +63093,13 @@ function defaultClassInstanceVertcat(rows) {
62056
63093
  }
62057
63094
 
62058
63095
  // src/numbl-core/jsUserFunctions.ts
63096
+ function callHandle(handle, args, nargout = 1) {
63097
+ const rt = getCurrentRuntime();
63098
+ if (!rt) {
63099
+ throw new RuntimeError("callHandle: no active runtime to invoke handle");
63100
+ }
63101
+ return rt.index(handle, args, nargout);
63102
+ }
62059
63103
  function funcNameFromFile(fileName) {
62060
63104
  const base = fileName.split("/").pop();
62061
63105
  return base.replace(/\.numbl\.js$/, "");
@@ -62101,6 +63145,8 @@ function instantiateWasm(wasmData) {
62101
63145
  const moduleImports = WebAssembly.Module.imports(wasmModule);
62102
63146
  const importObject = {};
62103
63147
  const neededModules = new Set(moduleImports.map((i) => i.module));
63148
+ const callbacks = /* @__PURE__ */ new Map();
63149
+ let nextCbId = 1;
62104
63150
  if (neededModules.has("wasi_snapshot_preview1")) {
62105
63151
  importObject.wasi_snapshot_preview1 = {
62106
63152
  fd_write: () => 0,
@@ -62120,10 +63166,36 @@ function instantiateWasm(wasmData) {
62120
63166
  if (neededModules.has("env")) {
62121
63167
  importObject.env = {
62122
63168
  emscripten_notify_memory_growth: () => {
63169
+ },
63170
+ // Scalar callback: WASM calls back into a registered handle with one
63171
+ // f64 and receives an f64. Exceptions thrown here (incl. a missing id)
63172
+ // propagate out through the WASM call into the apply.
63173
+ numbl_cb_d: (id, x) => {
63174
+ const fn = callbacks.get(id);
63175
+ if (!fn) {
63176
+ throw new RuntimeError(
63177
+ `numbl_cb_d: no callback registered for id ${id}`
63178
+ );
63179
+ }
63180
+ return fn(x);
62123
63181
  }
62124
63182
  };
62125
63183
  }
62126
- return new WebAssembly.Instance(wasmModule, importObject);
63184
+ const instance = new WebAssembly.Instance(
63185
+ wasmModule,
63186
+ importObject
63187
+ );
63188
+ instance.callbacks = {
63189
+ add(fn) {
63190
+ const id = nextCbId++;
63191
+ callbacks.set(id, fn);
63192
+ return id;
63193
+ },
63194
+ remove(id) {
63195
+ callbacks.delete(id);
63196
+ }
63197
+ };
63198
+ return instance;
62127
63199
  }
62128
63200
  function resolveBindings(file, directives, getWasmInstance, nativeBridge) {
62129
63201
  const wasmInstance = directives.wasm ? getWasmInstance(directives.wasm) : void 0;
@@ -62198,6 +63270,8 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge) {
62198
63270
  "wasm",
62199
63271
  "native",
62200
63272
  "importJS",
63273
+ "callHandle",
63274
+ "toNumber",
62201
63275
  libFile.source
62202
63276
  );
62203
63277
  const exports = factory(
@@ -62207,7 +63281,9 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge) {
62207
63281
  dummyRegister,
62208
63282
  wasmInstance,
62209
63283
  nativeLib,
62210
- importJS
63284
+ importJS,
63285
+ callHandle,
63286
+ toNumber
62211
63287
  );
62212
63288
  libCache.set(name, exports);
62213
63289
  return exports;
@@ -62245,6 +63321,8 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge) {
62245
63321
  "wasm",
62246
63322
  "native",
62247
63323
  "importJS",
63324
+ "callHandle",
63325
+ "toNumber",
62248
63326
  file.source
62249
63327
  );
62250
63328
  factory(
@@ -62254,7 +63332,9 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge) {
62254
63332
  registerFn,
62255
63333
  wasmInstance,
62256
63334
  nativeLib,
62257
- importJS
63335
+ importJS,
63336
+ callHandle,
63337
+ toNumber
62258
63338
  );
62259
63339
  if (!builtin) {
62260
63340
  throw new Error(
@@ -63874,6 +64954,15 @@ __export(interpreterExec_exports, {
63874
64954
  writeLValueBase: () => writeLValueBase
63875
64955
  });
63876
64956
 
64957
+ // src/numbl-core/jitDeclineDiagnostics.ts
64958
+ var lastDecline = null;
64959
+ function recordJitDecline(d) {
64960
+ lastDecline = d;
64961
+ }
64962
+ function getLastJitDecline() {
64963
+ return lastDecline;
64964
+ }
64965
+
63877
64966
  // src/numbl-core/runtime/cow.ts
63878
64967
  function cowCopy(v) {
63879
64968
  if (isRuntimeTensor(v)) {
@@ -64176,14 +65265,16 @@ function execStmtInner(stmt) {
64176
65265
  case "Directive": {
64177
65266
  if (stmt.directive === "assert_jit") {
64178
65267
  const wantC = stmt.args.includes("c");
65268
+ const decline = getLastJitDecline();
65269
+ const why = decline ? ` Most recent JIT decline (${decline.where}, ${decline.kind}): ${decline.message}` : ` (no JIT decline reason was recorded \u2014 the unit may have been declined before lowering, e.g. an unsupported input type.)`;
64179
65270
  if (this.optimization === "1") {
64180
65271
  throw new RuntimeError(
64181
- `%!numbl:assert_jit: expected the enclosing loop/function/script to be JS-JIT-compiled at --opt 1, but it ran in the interpreter. (Run with --opt 0 to silence.)`
65272
+ `%!numbl:assert_jit: expected the enclosing loop/function/script to be JS-JIT-compiled at --opt 1, but it ran in the interpreter.${why} (Run with --opt 0 to silence.)`
64182
65273
  );
64183
65274
  }
64184
65275
  if (this.optimization === "2" && wantC) {
64185
65276
  throw new RuntimeError(
64186
- `%!numbl:assert_jit c: expected the enclosing loop/function/script to be C-JIT-compiled at --opt 2, but it ran in the interpreter. (Run with --opt 0 to silence.)`
65277
+ `%!numbl:assert_jit c: expected the enclosing loop/function/script to be C-JIT-compiled at --opt 2, but it ran in the interpreter.${why} (Run with --opt 0 to silence.)`
64187
65278
  );
64188
65279
  }
64189
65280
  }
@@ -64255,13 +65346,16 @@ function evalExprNargout(expr, nargout) {
64255
65346
  return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
64256
65347
  }
64257
65348
  if (isRuntimeChar(rv)) return rv.value.length;
64258
- if (isRuntimeString(rv)) return rv.length;
65349
+ if (isRuntimeString(rv)) return 1;
64259
65350
  if (isRuntimeClassInstance(rv)) {
64260
- return this.rt.dispatch("end", 1, [
64261
- rv,
64262
- ctx.dimIndex + 1,
64263
- ctx.numIndices
64264
- ]);
65351
+ if (this.rt.resolveClassMethod?.(rv.className, "end")) {
65352
+ return this.rt.dispatch("end", 1, [
65353
+ rv,
65354
+ ctx.dimIndex + 1,
65355
+ ctx.numIndices
65356
+ ]);
65357
+ }
65358
+ return 1;
64265
65359
  }
64266
65360
  if (isRuntimeStructArray(rv)) {
64267
65361
  return rv.elements.length;
@@ -64270,6 +65364,10 @@ function evalExprNargout(expr, nargout) {
64270
65364
  if (ctx.numIndices === 1) return rv.elements.length;
64271
65365
  return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
64272
65366
  }
65367
+ if (isRuntimeStringArray(rv)) {
65368
+ if (ctx.numIndices === 1) return rv.data.length;
65369
+ return ctx.dimIndex < 2 ? rv.shape[ctx.dimIndex] : 1;
65370
+ }
64273
65371
  if (isRuntimeSparseMatrix(rv)) {
64274
65372
  if (ctx.numIndices === 1) return rv.m * rv.n;
64275
65373
  return ctx.dimIndex === 0 ? rv.m : ctx.dimIndex === 1 ? rv.n : 1;
@@ -64594,7 +65692,8 @@ function evalMember(expr, nargout) {
64594
65692
  if (lastDot > 0) {
64595
65693
  const prefix = dottedName.slice(0, lastDot);
64596
65694
  const methodName = dottedName.slice(lastDot + 1);
64597
- if (this.functionIndex.classStaticMethods.get(prefix)?.has(methodName)) {
65695
+ if (this.functionIndex.classStaticMethods.get(prefix)?.has(methodName) || // Implicit static `ClassName.empty` (handled by interpretClassMethod)
65696
+ methodName === "empty" && this.functionIndex.workspaceClasses.has(prefix)) {
64598
65697
  const target = {
64599
65698
  kind: "classMethod",
64600
65699
  className: prefix,
@@ -65846,6 +66945,22 @@ function interpretClassMethod(target, args, nargout) {
65846
66945
  () => this.callUserFunction(extFn, actualArgs2, nargout)
65847
66946
  );
65848
66947
  }
66948
+ if (methodName === "empty") {
66949
+ const dims = [];
66950
+ for (const a of args) {
66951
+ const rv = ensureRuntimeValue(a);
66952
+ if (isRuntimeTensor(rv)) for (const d of rv.data) dims.push(d);
66953
+ else dims.push(toNumber(rv));
66954
+ }
66955
+ if (dims.length === 1) dims.push(dims[0]);
66956
+ if (dims.length === 0) dims.push(0, 0);
66957
+ if (!dims.some((d) => d === 0)) {
66958
+ throw new RuntimeError(
66959
+ `${className}.empty: at least one dimension must be zero`
66960
+ );
66961
+ }
66962
+ return RTV.classInstanceArray(className, [], [dims[0], dims[1]]);
66963
+ }
65849
66964
  throw new RuntimeError(
65850
66965
  `No method '${methodName}' for class '${className}'`
65851
66966
  );
@@ -65971,8 +67086,9 @@ function callUserFunction(fn, args, nargout, narginOverride) {
65971
67086
  const fnEnv = new Environment();
65972
67087
  fnEnv.rt = this.rt;
65973
67088
  fnEnv.persistentFuncId = `${this.currentFile}:${fn.name}`;
65974
- const hasVarargin = fn.params.length > 0 && fn.params[fn.params.length - 1] === "varargin";
65975
- const regularParams = hasVarargin ? fn.params.slice(0, -1) : fn.params;
67089
+ const vararginIdx = fn.params.indexOf("varargin");
67090
+ const hasVarargin = vararginIdx !== -1;
67091
+ const regularParams = hasVarargin ? fn.params.slice(0, vararginIdx) : fn.params;
65976
67092
  let numPositional = regularParams.length;
65977
67093
  const inputBlocks = (fn.argumentsBlocks ?? []).filter(
65978
67094
  (b) => b.kind !== "Output"
@@ -65991,7 +67107,14 @@ function callUserFunction(fn, args, nargout, narginOverride) {
65991
67107
  }
65992
67108
  }
65993
67109
  if (hasVarargin) {
65994
- const extraArgs = sharedArgs.slice(regularParams.length).map((a) => ensureRuntimeValue(a));
67110
+ let extras = sharedArgs.slice(regularParams.length);
67111
+ if (vararginIdx !== fn.params.length - 1) {
67112
+ extras = extras.slice(
67113
+ 0,
67114
+ nameValueTailStart(extras, nameValueFieldNames(fn))
67115
+ );
67116
+ }
67117
+ const extraArgs = extras.map((a) => ensureRuntimeValue(a));
65995
67118
  fnEnv.set("varargin", RTV.cell(extraArgs, [1, extraArgs.length]));
65996
67119
  }
65997
67120
  fnEnv.set("$nargin", narginOverride ?? args.length);
@@ -66376,6 +67499,28 @@ function evalInLocalScope(codeArg, fileName) {
66376
67499
  }
66377
67500
  throw new RuntimeError("eval not available in this context");
66378
67501
  }
67502
+ function nameValueFieldNames(fn) {
67503
+ const names = /* @__PURE__ */ new Set();
67504
+ for (const block of fn.argumentsBlocks ?? []) {
67505
+ if (block.kind === "Output" || block.kind === "OutputRepeating") continue;
67506
+ for (const e of block.entries) {
67507
+ const dot2 = e.name.indexOf(".");
67508
+ if (dot2 >= 0) names.add(e.name.slice(dot2 + 1));
67509
+ }
67510
+ }
67511
+ return names;
67512
+ }
67513
+ function nameValueTailStart(extras, fieldNames) {
67514
+ if (fieldNames.size === 0) return extras.length;
67515
+ for (let i = 0; i < extras.length; i++) {
67516
+ if (extras[i] === void 0) continue;
67517
+ const rv = ensureRuntimeValue(extras[i]);
67518
+ if ((isRuntimeChar(rv) || isRuntimeString(rv)) && fieldNames.has(toString(rv))) {
67519
+ return i;
67520
+ }
67521
+ }
67522
+ return extras.length;
67523
+ }
66379
67524
  function processArgumentsBlocks(fn, args) {
66380
67525
  const argBlocks = fn.argumentsBlocks;
66381
67526
  if (!argBlocks || argBlocks.length === 0) return;
@@ -66410,9 +67555,18 @@ function processArgumentsBlocks(fn, args) {
66410
67555
  );
66411
67556
  }
66412
67557
  }
67558
+ const vararginIdx = fn.params.indexOf("varargin");
66413
67559
  for (const [paramName, fields] of nvGroups) {
66414
67560
  const pIdx = fn.params.indexOf(paramName);
66415
- const nvArgs = args.slice(pIdx >= 0 ? pIdx : args.length);
67561
+ let nvArgs;
67562
+ if (pIdx >= 0 && vararginIdx >= 0 && vararginIdx < pIdx) {
67563
+ const extras = args.slice(vararginIdx);
67564
+ nvArgs = extras.slice(
67565
+ nameValueTailStart(extras, nameValueFieldNames(fn))
67566
+ );
67567
+ } else {
67568
+ nvArgs = args.slice(pIdx >= 0 ? pIdx : args.length);
67569
+ }
66416
67570
  const defaults = {};
66417
67571
  for (const { field, defaultExpr } of fields) {
66418
67572
  if (defaultExpr) defaults[field] = this.evalExpr(defaultExpr);
@@ -67698,6 +68852,11 @@ var shimFiles = [
67698
68852
  else
67699
68853
  result = val;
67700
68854
  end
68855
+ % The backing dictionary stores char values as strings;
68856
+ % MATLAB's containers.Map hands back char.
68857
+ if strcmp(obj.ValueType, 'char') && isstring(result)
68858
+ result = char(result);
68859
+ end
67701
68860
  elseif strcmp(S(1).type, '.')
67702
68861
  result = builtin('subsref', obj, S);
67703
68862
  elseif strcmp(S(1).type, '{}')
@@ -67731,11 +68890,14 @@ var shimFiles = [
67731
68890
  end
67732
68891
  k = keys(obj.data_);
67733
68892
  if strcmp(obj.KeyType, 'char')
67734
- % Return cell array of char vectors
67735
- if iscell(k)
67736
- result = k;
67737
- else
67738
- result = {k};
68893
+ % Return a cellstr: the backing dictionary stores keys as
68894
+ % strings, but MATLAB's containers.Map returns char vectors.
68895
+ if ~iscell(k)
68896
+ k = {k};
68897
+ end
68898
+ result = cell(size(k));
68899
+ for i = 1:numel(k)
68900
+ result{i} = char(k{i});
67739
68901
  end
67740
68902
  else
67741
68903
  % Numeric keys: parse back from string
@@ -67768,6 +68930,14 @@ var shimFiles = [
67768
68930
  result{i} = v(i);
67769
68931
  end
67770
68932
  end
68933
+ if strcmp(obj.ValueType, 'char')
68934
+ % Stored as strings in the dictionary; MATLAB returns char.
68935
+ for i = 1:numel(result)
68936
+ if isstring(result{i})
68937
+ result{i} = char(result{i});
68938
+ end
68939
+ end
68940
+ end
67771
68941
  end
67772
68942
  end
67773
68943
 
@@ -77094,6 +78264,30 @@ var sin = defineUnaryRealMath({
77094
78264
  complex: { cFnComplex: "mtoc2_csin", jsFnComplex: cSin }
77095
78265
  });
77096
78266
 
78267
+ // src/numbl-core/jit/builtins/defs/math/rand.ts
78268
+ var rand = {
78269
+ name: "rand",
78270
+ transfer(argTypes, nargout) {
78271
+ if (nargout > 1) {
78272
+ throw new UnsupportedConstruct(
78273
+ `'rand' does not support multi-output (nargout=${nargout})`
78274
+ );
78275
+ }
78276
+ if (argTypes.length !== 0) {
78277
+ throw new UnsupportedConstruct(
78278
+ `JS-JIT 'rand' supports only the scalar form rand() so far (got ${argTypes.length} arg(s)); matrix/seed forms run in the interpreter`
78279
+ );
78280
+ }
78281
+ return [scalarDouble("nonneg")];
78282
+ },
78283
+ emitJs() {
78284
+ return "$rand()";
78285
+ },
78286
+ call() {
78287
+ return [rngRandom()];
78288
+ }
78289
+ };
78290
+
77097
78291
  // src/numbl-core/jit/builtins/defs/math/tan.ts
77098
78292
  var tan = defineUnaryRealMath({
77099
78293
  name: "tan",
@@ -82477,6 +83671,7 @@ for (const b of [
82477
83671
  stdBuiltin,
82478
83672
  min,
82479
83673
  max,
83674
+ rand,
82480
83675
  any,
82481
83676
  all,
82482
83677
  zeros,
@@ -88262,12 +89457,13 @@ function emitJsProgram(prog, opts = {}) {
88262
89457
  const wrapperLines = [];
88263
89458
  if (opts.exposeSpec !== void 0) {
88264
89459
  wrapperLines.push(
88265
- `return function ($h) { globalThis.$write = $h.write; globalThis.$plotDispatch = $h.plotDispatch; return ${opts.exposeSpec}; };`
89460
+ `return function ($h) { globalThis.$write = $h.write; globalThis.$plotDispatch = $h.plotDispatch; globalThis.$rand = $h.rand; return ${opts.exposeSpec}; };`
88266
89461
  );
88267
89462
  } else {
88268
89463
  wrapperLines.push("function run($h) {");
88269
89464
  wrapperLines.push(" globalThis.$write = $h.write;");
88270
89465
  wrapperLines.push(" globalThis.$plotDispatch = $h.plotDispatch;");
89466
+ wrapperLines.push(" globalThis.$rand = $h.rand;");
88271
89467
  const locals = collectAssignedLocals(prog.topLevelStmts);
88272
89468
  if (locals.length > 0) {
88273
89469
  wrapperLines.push(` let ${locals.join(", ")};`);
@@ -90304,6 +91500,7 @@ function getOrCreateSession(interp) {
90304
91500
  function buildHostHelpers(rt) {
90305
91501
  return {
90306
91502
  write: (s) => rt.output(s),
91503
+ rand: () => rngRandom(),
90307
91504
  plotDispatch: (name, args) => {
90308
91505
  const runtimeArgs = args.map((a) => jitToNumbl(a));
90309
91506
  const handled = dispatchPlotBuiltin(
@@ -90396,6 +91593,11 @@ var jitCallExecutor = {
90396
91593
  return { specFn };
90397
91594
  } catch (e) {
90398
91595
  if (e instanceof UnsupportedConstruct || e instanceof TypeError2) {
91596
+ recordJitDecline({
91597
+ message: e.message,
91598
+ kind: e.constructor.name,
91599
+ where: "jit-call"
91600
+ });
90399
91601
  return null;
90400
91602
  }
90401
91603
  throw e;
@@ -90522,6 +91724,11 @@ var jitLoopExecutor = {
90522
91724
  return { specFn };
90523
91725
  } catch (e) {
90524
91726
  if (e instanceof UnsupportedConstruct || e instanceof TypeError2) {
91727
+ recordJitDecline({
91728
+ message: e.message,
91729
+ kind: e.constructor.name,
91730
+ where: "jit-loop"
91731
+ });
90525
91732
  return null;
90526
91733
  }
90527
91734
  throw e;
@@ -90662,6 +91869,11 @@ var jitTopLevelExecutor = {
90662
91869
  return { specFn, nargout };
90663
91870
  } catch (e) {
90664
91871
  if (e instanceof UnsupportedConstruct || e instanceof TypeError2) {
91872
+ recordJitDecline({
91873
+ message: e.message,
91874
+ kind: e.constructor.name,
91875
+ where: "jit-top-level"
91876
+ });
90665
91877
  return null;
90666
91878
  }
90667
91879
  throw e;
@@ -90866,6 +92078,31 @@ function executeCode(source, options = {}, workspaceFiles, mainFileName = "scrip
90866
92078
  implicitCwdPath = null;
90867
92079
  }
90868
92080
  }
92081
+ if (searchPaths && options.fileIO?.scanDirectory) {
92082
+ const haveM = new Set(mWorkspaceFiles.map((f) => f.name));
92083
+ for (const dir of searchPaths) {
92084
+ try {
92085
+ const absDir = options.fileIO.resolvePath?.(dir) ?? dir;
92086
+ for (const f of options.fileIO.scanDirectory(absDir)) {
92087
+ if (f.name.endsWith(".m")) {
92088
+ if (!haveM.has(f.name)) {
92089
+ mWorkspaceFiles.push(f);
92090
+ haveM.add(f.name);
92091
+ }
92092
+ } else if (isNumblJsFile(f.name)) {
92093
+ if (!jsWorkspaceFiles.some((e) => e.name === f.name)) {
92094
+ jsWorkspaceFiles.push(f);
92095
+ }
92096
+ } else if (f.name.endsWith(".wasm")) {
92097
+ if (!wasmWorkspaceFiles.some((e) => e.name === f.name)) {
92098
+ wasmWorkspaceFiles.push(f);
92099
+ }
92100
+ }
92101
+ }
92102
+ } catch {
92103
+ }
92104
+ }
92105
+ }
90869
92106
  const jsUserFunctions = loadJsUserFunctions(
90870
92107
  jsWorkspaceFiles,
90871
92108
  wasmWorkspaceFiles,
@@ -91325,9 +92562,790 @@ async function load() {
91325
92562
  setDelaunayBackend((points, dim) => qhull.delaunay(points, dim).facets);
91326
92563
  setConvexHullBackend((points, dim) => qhull.convexHull(points, dim).facets);
91327
92564
  }
92565
+
92566
+ // src/vfs/VirtualFileSystem.ts
92567
+ var VirtualFileSystem = class {
92568
+ files = /* @__PURE__ */ new Map();
92569
+ directories = /* @__PURE__ */ new Set();
92570
+ cwd = "/project";
92571
+ // Change tracking
92572
+ createdFiles = /* @__PURE__ */ new Set();
92573
+ modifiedFiles = /* @__PURE__ */ new Set();
92574
+ deletedFiles = /* @__PURE__ */ new Set();
92575
+ /** Clear change tracking. Call after populating the VFS with initial files. */
92576
+ clearChangeTracking() {
92577
+ this.createdFiles.clear();
92578
+ this.modifiedFiles.clear();
92579
+ this.deletedFiles.clear();
92580
+ }
92581
+ /** Normalize a path to absolute form. */
92582
+ normalizePath(p2) {
92583
+ if (!p2.startsWith("/")) {
92584
+ p2 = this.cwd + "/" + p2;
92585
+ }
92586
+ const parts = p2.split("/");
92587
+ const resolved = [];
92588
+ for (const part of parts) {
92589
+ if (part === "" || part === ".") continue;
92590
+ if (part === "..") {
92591
+ if (resolved.length > 0) resolved.pop();
92592
+ } else {
92593
+ resolved.push(part);
92594
+ }
92595
+ }
92596
+ return "/" + resolved.join("/");
92597
+ }
92598
+ getCwd() {
92599
+ return this.cwd;
92600
+ }
92601
+ setCwd(dir) {
92602
+ this.cwd = this.normalizePath(dir);
92603
+ }
92604
+ readFile(path) {
92605
+ const norm2 = this.normalizePath(path);
92606
+ const file = this.files.get(norm2);
92607
+ if (!file) throw new Error(`File not found: ${path}`);
92608
+ return file.content;
92609
+ }
92610
+ writeFile(path, content) {
92611
+ const norm2 = this.normalizePath(path);
92612
+ const existed = this.files.has(norm2);
92613
+ this.files.set(norm2, { content, mtimeMs: Date.now() });
92614
+ this.ensureParentDirs(norm2);
92615
+ if (this.deletedFiles.has(norm2)) {
92616
+ this.deletedFiles.delete(norm2);
92617
+ this.modifiedFiles.add(norm2);
92618
+ } else if (!existed) {
92619
+ this.createdFiles.add(norm2);
92620
+ } else if (!this.createdFiles.has(norm2)) {
92621
+ this.modifiedFiles.add(norm2);
92622
+ }
92623
+ }
92624
+ deleteFile(path) {
92625
+ const norm2 = this.normalizePath(path);
92626
+ if (!this.files.has(norm2)) return false;
92627
+ this.files.delete(norm2);
92628
+ if (this.createdFiles.has(norm2)) {
92629
+ this.createdFiles.delete(norm2);
92630
+ this.modifiedFiles.delete(norm2);
92631
+ } else {
92632
+ this.modifiedFiles.delete(norm2);
92633
+ this.deletedFiles.add(norm2);
92634
+ }
92635
+ return true;
92636
+ }
92637
+ exists(path) {
92638
+ const norm2 = this.normalizePath(path);
92639
+ if (this.files.has(norm2)) return "file";
92640
+ if (this.directories.has(norm2)) return "dir";
92641
+ const prefix = norm2 + "/";
92642
+ for (const key of this.files.keys()) {
92643
+ if (key.startsWith(prefix)) return "dir";
92644
+ }
92645
+ return null;
92646
+ }
92647
+ fileSize(path) {
92648
+ const norm2 = this.normalizePath(path);
92649
+ const file = this.files.get(norm2);
92650
+ return file ? file.content.length : 0;
92651
+ }
92652
+ mkdir(dirPath) {
92653
+ const norm2 = this.normalizePath(dirPath);
92654
+ this.directories.add(norm2);
92655
+ this.ensureParentDirs(norm2 + "/placeholder");
92656
+ return true;
92657
+ }
92658
+ /** Move/rename a file or directory tree. Returns true on success. */
92659
+ movefile(source, destination) {
92660
+ const srcNorm = this.normalizePath(source);
92661
+ const srcType = this.exists(srcNorm);
92662
+ if (srcType === null) return false;
92663
+ let dstNorm = this.normalizePath(destination);
92664
+ const dstType = this.exists(dstNorm);
92665
+ if (dstType === "dir") {
92666
+ const lastSlash = srcNorm.lastIndexOf("/");
92667
+ const baseName = lastSlash >= 0 ? srcNorm.slice(lastSlash + 1) : srcNorm;
92668
+ dstNorm = (dstNorm === "/" ? "" : dstNorm) + "/" + baseName;
92669
+ }
92670
+ if (srcType === "dir" && this.exists(dstNorm) === "file") return false;
92671
+ if (srcType === "file") {
92672
+ const content = this.files.get(srcNorm).content;
92673
+ if (this.exists(dstNorm) === "file") this.deleteFile(dstNorm);
92674
+ this.writeFile(dstNorm, content);
92675
+ this.deleteFile(srcNorm);
92676
+ return true;
92677
+ }
92678
+ const srcPrefix = srcNorm + "/";
92679
+ const filesToMove = [];
92680
+ for (const [path, file] of this.files) {
92681
+ if (path === srcNorm || path.startsWith(srcPrefix)) {
92682
+ const rest = path === srcNorm ? "" : path.slice(srcNorm.length);
92683
+ filesToMove.push({
92684
+ from: path,
92685
+ to: dstNorm + rest,
92686
+ content: file.content
92687
+ });
92688
+ }
92689
+ }
92690
+ const dirsToMove = [];
92691
+ for (const dir of this.directories) {
92692
+ if (dir === srcNorm || dir.startsWith(srcPrefix)) {
92693
+ const rest = dir === srcNorm ? "" : dir.slice(srcNorm.length);
92694
+ dirsToMove.push({ from: dir, to: dstNorm + rest });
92695
+ }
92696
+ }
92697
+ for (const { from } of filesToMove) this.deleteFile(from);
92698
+ for (const { from } of dirsToMove) this.directories.delete(from);
92699
+ this.directories.add(dstNorm);
92700
+ for (const { to } of dirsToMove) this.directories.add(to);
92701
+ for (const { to, content } of filesToMove) this.writeFile(to, content);
92702
+ return true;
92703
+ }
92704
+ /** Copy a file or directory tree (source is left in place). True on success. */
92705
+ copyfile(source, destination) {
92706
+ const srcNorm = this.normalizePath(source);
92707
+ const srcType = this.exists(srcNorm);
92708
+ if (srcType === null) return false;
92709
+ let dstNorm = this.normalizePath(destination);
92710
+ if (this.exists(dstNorm) === "dir") {
92711
+ const lastSlash = srcNorm.lastIndexOf("/");
92712
+ const baseName = lastSlash >= 0 ? srcNorm.slice(lastSlash + 1) : srcNorm;
92713
+ dstNorm = (dstNorm === "/" ? "" : dstNorm) + "/" + baseName;
92714
+ }
92715
+ if (srcType === "dir" && this.exists(dstNorm) === "file") return false;
92716
+ if (srcType === "file") {
92717
+ const content = this.files.get(srcNorm).content;
92718
+ if (this.exists(dstNorm) === "file") this.deleteFile(dstNorm);
92719
+ this.writeFile(dstNorm, content);
92720
+ return true;
92721
+ }
92722
+ const srcPrefix = srcNorm + "/";
92723
+ for (const [path, file] of [...this.files]) {
92724
+ if (path === srcNorm || path.startsWith(srcPrefix)) {
92725
+ const rest = path === srcNorm ? "" : path.slice(srcNorm.length);
92726
+ this.writeFile(dstNorm + rest, file.content);
92727
+ }
92728
+ }
92729
+ for (const dir of [...this.directories]) {
92730
+ if (dir === srcNorm || dir.startsWith(srcPrefix)) {
92731
+ const rest = dir === srcNorm ? "" : dir.slice(srcNorm.length);
92732
+ this.directories.add(dstNorm + rest);
92733
+ }
92734
+ }
92735
+ this.directories.add(dstNorm);
92736
+ return true;
92737
+ }
92738
+ /** Resolve a path to its (normalized) absolute path + attributes, or null. */
92739
+ fileattrib(path) {
92740
+ const norm2 = this.normalizePath(path);
92741
+ const t = this.exists(norm2);
92742
+ if (t === null) return null;
92743
+ return {
92744
+ Name: norm2,
92745
+ directory: t === "dir",
92746
+ UserRead: true,
92747
+ UserWrite: true,
92748
+ UserExecute: t === "dir"
92749
+ };
92750
+ }
92751
+ rmdir(dirPath, recursive) {
92752
+ const norm2 = this.normalizePath(dirPath);
92753
+ if (this.exists(norm2) !== "dir") return false;
92754
+ if (recursive) {
92755
+ const prefix = norm2 + "/";
92756
+ for (const key of [...this.files.keys()]) {
92757
+ if (key.startsWith(prefix)) {
92758
+ this.deleteFile(key);
92759
+ }
92760
+ }
92761
+ for (const dir of [...this.directories]) {
92762
+ if (dir === norm2 || dir.startsWith(prefix)) {
92763
+ this.directories.delete(dir);
92764
+ }
92765
+ }
92766
+ } else {
92767
+ const prefix = norm2 + "/";
92768
+ for (const key of this.files.keys()) {
92769
+ if (key.startsWith(prefix)) return false;
92770
+ }
92771
+ this.directories.delete(norm2);
92772
+ }
92773
+ return true;
92774
+ }
92775
+ /** List entries in a directory. */
92776
+ listDir(dirPath) {
92777
+ const norm2 = this.normalizePath(dirPath);
92778
+ const prefix = norm2 === "/" ? "/" : norm2 + "/";
92779
+ const results = [];
92780
+ const now = Date.now();
92781
+ results.push({
92782
+ name: ".",
92783
+ folder: norm2,
92784
+ bytes: 0,
92785
+ isdir: true,
92786
+ mtimeMs: now
92787
+ });
92788
+ results.push({
92789
+ name: "..",
92790
+ folder: norm2,
92791
+ bytes: 0,
92792
+ isdir: true,
92793
+ mtimeMs: now
92794
+ });
92795
+ const seen = /* @__PURE__ */ new Set();
92796
+ for (const [path, file] of this.files) {
92797
+ if (!path.startsWith(prefix)) continue;
92798
+ const rest = path.slice(prefix.length);
92799
+ const slashIdx = rest.indexOf("/");
92800
+ if (slashIdx === -1) {
92801
+ results.push({
92802
+ name: rest,
92803
+ folder: norm2,
92804
+ bytes: file.content.length,
92805
+ isdir: false,
92806
+ mtimeMs: file.mtimeMs
92807
+ });
92808
+ } else {
92809
+ const dirName = rest.slice(0, slashIdx);
92810
+ if (!seen.has(dirName)) {
92811
+ seen.add(dirName);
92812
+ results.push({
92813
+ name: dirName,
92814
+ folder: norm2,
92815
+ bytes: 0,
92816
+ isdir: true,
92817
+ mtimeMs: now
92818
+ });
92819
+ }
92820
+ }
92821
+ }
92822
+ for (const dir of this.directories) {
92823
+ if (!dir.startsWith(prefix)) continue;
92824
+ const rest = dir.slice(prefix.length);
92825
+ if (!rest.includes("/") && rest.length > 0 && !seen.has(rest)) {
92826
+ seen.add(rest);
92827
+ results.push({
92828
+ name: rest,
92829
+ folder: norm2,
92830
+ bytes: 0,
92831
+ isdir: true,
92832
+ mtimeMs: now
92833
+ });
92834
+ }
92835
+ }
92836
+ return results;
92837
+ }
92838
+ /** List all file paths in the VFS. */
92839
+ allFiles() {
92840
+ return [...this.files.keys()];
92841
+ }
92842
+ /** Get the changes since the VFS was created. */
92843
+ getChanges() {
92844
+ const created = [];
92845
+ const modified = [];
92846
+ for (const path of this.createdFiles) {
92847
+ const file = this.files.get(path);
92848
+ if (file) created.push({ path, content: file.content });
92849
+ }
92850
+ for (const path of this.modifiedFiles) {
92851
+ const file = this.files.get(path);
92852
+ if (file) modified.push({ path, content: file.content });
92853
+ }
92854
+ return {
92855
+ created,
92856
+ modified,
92857
+ deleted: [...this.deletedFiles]
92858
+ };
92859
+ }
92860
+ ensureParentDirs(path) {
92861
+ const parts = path.split("/").filter(Boolean);
92862
+ for (let i = 1; i < parts.length; i++) {
92863
+ const dir = "/" + parts.slice(0, i).join("/");
92864
+ this.directories.add(dir);
92865
+ }
92866
+ }
92867
+ };
92868
+
92869
+ // src/vfs/BrowserFileIOAdapter.ts
92870
+ import { unzipSync } from "fflate";
92871
+ var TEXT_DECODER = new TextDecoder("utf-8");
92872
+ var TEXT_ENCODER = new TextEncoder();
92873
+ var READ_CHUNK_SIZE = 8192;
92874
+ var BrowserFileIOAdapter = class {
92875
+ constructor(vfs) {
92876
+ this.vfs = vfs;
92877
+ }
92878
+ nextFid = 3;
92879
+ // 0=stdin, 1=stdout, 2=stderr reserved
92880
+ openFiles = /* @__PURE__ */ new Map();
92881
+ fopen(filename, permission) {
92882
+ const perm = permission.replace(/b/g, "");
92883
+ const path = this.vfs.normalizePath(filename);
92884
+ try {
92885
+ let data;
92886
+ let pos = 0;
92887
+ if (perm === "r" || perm === "r+") {
92888
+ if (this.vfs.exists(filename) !== "file") return -1;
92889
+ data = new Uint8Array(this.vfs.readFile(filename));
92890
+ } else if (perm === "w" || perm === "w+") {
92891
+ data = new Uint8Array(0);
92892
+ } else if (perm === "a" || perm === "a+") {
92893
+ if (this.vfs.exists(filename) === "file") {
92894
+ data = new Uint8Array(this.vfs.readFile(filename));
92895
+ pos = data.length;
92896
+ } else {
92897
+ data = new Uint8Array(0);
92898
+ }
92899
+ } else {
92900
+ return -1;
92901
+ }
92902
+ const fid = this.nextFid++;
92903
+ this.openFiles.set(fid, {
92904
+ path,
92905
+ permission: perm,
92906
+ lastError: "",
92907
+ buffer: "",
92908
+ eof: false,
92909
+ pos,
92910
+ data,
92911
+ dataLen: data.length,
92912
+ dirty: perm === "w" || perm === "a"
92913
+ // w starts dirty (truncated or new)
92914
+ });
92915
+ return fid;
92916
+ } catch {
92917
+ return -1;
92918
+ }
92919
+ }
92920
+ fclose(fidOrAll) {
92921
+ if (fidOrAll === "all") {
92922
+ for (const [, entry2] of this.openFiles) {
92923
+ this.flushEntry(entry2);
92924
+ }
92925
+ this.openFiles.clear();
92926
+ return 0;
92927
+ }
92928
+ const entry = this.openFiles.get(fidOrAll);
92929
+ if (!entry) return -1;
92930
+ this.flushEntry(entry);
92931
+ this.openFiles.delete(fidOrAll);
92932
+ return 0;
92933
+ }
92934
+ fgetl(fid) {
92935
+ const entry = this.getEntry(fid);
92936
+ if (!entry) return -1;
92937
+ return this.readLine(entry, false);
92938
+ }
92939
+ fgets(fid) {
92940
+ const entry = this.getEntry(fid);
92941
+ if (!entry) return -1;
92942
+ return this.readLine(entry, true);
92943
+ }
92944
+ fileread(filename) {
92945
+ const data = this.vfs.readFile(filename);
92946
+ return TEXT_DECODER.decode(data);
92947
+ }
92948
+ feof(fid) {
92949
+ const entry = this.getEntry(fid);
92950
+ if (!entry) return 1;
92951
+ if (entry.buffer.length > 0) return 0;
92952
+ if (entry.eof) return 1;
92953
+ if (entry.pos >= entry.dataLen) {
92954
+ entry.eof = true;
92955
+ return 1;
92956
+ }
92957
+ return 0;
92958
+ }
92959
+ ferror(fid) {
92960
+ const entry = this.getEntry(fid);
92961
+ if (!entry) return "Invalid file identifier";
92962
+ return entry.lastError;
92963
+ }
92964
+ fwrite(fid, text) {
92965
+ const entry = this.getEntry(fid);
92966
+ if (!entry) throw new Error(`Invalid file identifier: ${fid}`);
92967
+ const bytes = TEXT_ENCODER.encode(text);
92968
+ this.writeBytes(entry, bytes);
92969
+ entry.lastError = "";
92970
+ }
92971
+ freadBytes(fid, count) {
92972
+ const entry = this.getEntry(fid);
92973
+ if (!entry) throw new Error(`Invalid file identifier: ${fid}`);
92974
+ if (entry.buffer.length > 0) {
92975
+ entry.buffer = "";
92976
+ }
92977
+ const available = entry.dataLen - entry.pos;
92978
+ const toRead = Math.min(count, available);
92979
+ if (toRead <= 0) {
92980
+ entry.eof = true;
92981
+ return new Uint8Array(0);
92982
+ }
92983
+ const result = new Uint8Array(toRead);
92984
+ result.set(entry.data.subarray(entry.pos, entry.pos + toRead));
92985
+ entry.pos += toRead;
92986
+ if (entry.pos >= entry.dataLen) entry.eof = true;
92987
+ entry.lastError = "";
92988
+ return result;
92989
+ }
92990
+ fwriteBytes(fid, data) {
92991
+ const entry = this.getEntry(fid);
92992
+ if (!entry) throw new Error(`Invalid file identifier: ${fid}`);
92993
+ this.writeBytes(entry, data);
92994
+ entry.lastError = "";
92995
+ return data.length;
92996
+ }
92997
+ fseek(fid, offset, origin) {
92998
+ const entry = this.getEntry(fid);
92999
+ if (!entry) return -1;
93000
+ entry.buffer = "";
93001
+ entry.eof = false;
93002
+ if (origin === -1) {
93003
+ entry.pos = offset;
93004
+ } else if (origin === 0) {
93005
+ entry.pos += offset;
93006
+ } else {
93007
+ entry.pos = entry.dataLen + offset;
93008
+ }
93009
+ return 0;
93010
+ }
93011
+ ftell(fid) {
93012
+ const entry = this.getEntry(fid);
93013
+ if (!entry) return -1;
93014
+ return entry.pos;
93015
+ }
93016
+ scanDirectory(dirPath) {
93017
+ const norm2 = this.vfs.normalizePath(dirPath);
93018
+ const prefix = norm2 === "/" ? "/" : norm2 + "/";
93019
+ const results = [];
93020
+ for (const filePath of this.vfs.allFiles()) {
93021
+ if (!filePath.startsWith(prefix)) continue;
93022
+ const relativePath = filePath.slice(prefix.length);
93023
+ if (!relativePath) continue;
93024
+ const segments = relativePath.split("/");
93025
+ const dirs = segments.slice(0, -1);
93026
+ const allSpecial = dirs.every(
93027
+ (d) => d.startsWith("@") || d.startsWith("+") || d === "private"
93028
+ );
93029
+ if (!allSpecial) continue;
93030
+ if (!relativePath.endsWith(".m") && !relativePath.endsWith(".numbl.js") && !relativePath.endsWith(".wasm")) {
93031
+ continue;
93032
+ }
93033
+ try {
93034
+ const content = this.vfs.readFile(filePath);
93035
+ if (relativePath.endsWith(".wasm")) {
93036
+ results.push({
93037
+ name: filePath,
93038
+ source: "",
93039
+ data: new Uint8Array(content)
93040
+ });
93041
+ } else {
93042
+ results.push({
93043
+ name: filePath,
93044
+ source: TEXT_DECODER.decode(content)
93045
+ });
93046
+ }
93047
+ } catch {
93048
+ }
93049
+ }
93050
+ return results;
93051
+ }
93052
+ resolvePath(dirPath) {
93053
+ return this.vfs.normalizePath(dirPath);
93054
+ }
93055
+ existsPath(path) {
93056
+ return this.vfs.exists(path);
93057
+ }
93058
+ mkdir(dirPath) {
93059
+ return this.vfs.mkdir(dirPath);
93060
+ }
93061
+ tempdir() {
93062
+ return "/tmp";
93063
+ }
93064
+ userpath() {
93065
+ return "/system";
93066
+ }
93067
+ deleteFile(pattern) {
93068
+ const norm2 = this.vfs.normalizePath(pattern);
93069
+ if (norm2.includes("*") || norm2.includes("?")) {
93070
+ const lastSlash = norm2.lastIndexOf("/");
93071
+ const dir = norm2.slice(0, lastSlash);
93072
+ const globPat = norm2.slice(lastSlash + 1);
93073
+ const re = new RegExp(
93074
+ "^" + globPat.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".") + "$"
93075
+ );
93076
+ const entries = this.vfs.listDir(dir);
93077
+ for (const entry of entries) {
93078
+ if (!entry.isdir && re.test(entry.name)) {
93079
+ this.vfs.deleteFile(dir + "/" + entry.name);
93080
+ }
93081
+ }
93082
+ } else {
93083
+ this.vfs.deleteFile(norm2);
93084
+ }
93085
+ }
93086
+ rmdir(dirPath, recursive) {
93087
+ return this.vfs.rmdir(dirPath, recursive);
93088
+ }
93089
+ movefile(source, destination) {
93090
+ return this.vfs.movefile(source, destination);
93091
+ }
93092
+ copyfile(source, destination) {
93093
+ return this.vfs.copyfile(source, destination);
93094
+ }
93095
+ fileattrib(path) {
93096
+ return this.vfs.fileattrib(path);
93097
+ }
93098
+ listDir(dirPath) {
93099
+ const norm2 = this.vfs.normalizePath(dirPath);
93100
+ if (dirPath.includes("**")) {
93101
+ return this.listDirRecursive(dirPath);
93102
+ }
93103
+ if (dirPath.includes("*") || dirPath.includes("?")) {
93104
+ return this.listDirGlob(dirPath);
93105
+ }
93106
+ const type = this.vfs.exists(dirPath);
93107
+ if (type === "file") {
93108
+ const lastSlash = norm2.lastIndexOf("/");
93109
+ const name = lastSlash >= 0 ? norm2.slice(lastSlash + 1) : norm2;
93110
+ const folder = lastSlash >= 0 ? norm2.slice(0, lastSlash) : "/";
93111
+ return [
93112
+ {
93113
+ name,
93114
+ folder,
93115
+ bytes: this.vfs.fileSize(dirPath),
93116
+ isdir: false,
93117
+ mtimeMs: Date.now()
93118
+ }
93119
+ ];
93120
+ }
93121
+ return this.vfs.listDir(dirPath);
93122
+ }
93123
+ websave(url, filename, options) {
93124
+ url = filterUrl(url);
93125
+ const method = options?.requestMethod?.toUpperCase() || "GET";
93126
+ const xhr = new XMLHttpRequest();
93127
+ xhr.open(method, url, false);
93128
+ if (options?.timeout) xhr.timeout = Math.round(options.timeout * 1e3);
93129
+ if (options?.username && options?.password) {
93130
+ xhr.setRequestHeader(
93131
+ "Authorization",
93132
+ "Basic " + btoa(`${options.username}:${options.password}`)
93133
+ );
93134
+ }
93135
+ if (options?.keyName && options?.keyValue) {
93136
+ xhr.setRequestHeader(options.keyName, options.keyValue);
93137
+ }
93138
+ xhr.responseType = "arraybuffer";
93139
+ xhr.send();
93140
+ if (xhr.status < 200 || xhr.status >= 300) {
93141
+ throw new Error(`websave: HTTP ${xhr.status} for ${url}`);
93142
+ }
93143
+ const data = new Uint8Array(xhr.response);
93144
+ this.vfs.writeFile(filename, data);
93145
+ }
93146
+ webread(url, options) {
93147
+ url = filterUrl(url);
93148
+ const method = options?.requestMethod?.toUpperCase() || "GET";
93149
+ const xhr = new XMLHttpRequest();
93150
+ xhr.open(method, url, false);
93151
+ if (options?.timeout) xhr.timeout = Math.round(options.timeout * 1e3);
93152
+ if (options?.username && options?.password) {
93153
+ xhr.setRequestHeader(
93154
+ "Authorization",
93155
+ "Basic " + btoa(`${options.username}:${options.password}`)
93156
+ );
93157
+ }
93158
+ if (options?.keyName && options?.keyValue) {
93159
+ xhr.setRequestHeader(options.keyName, options.keyValue);
93160
+ }
93161
+ xhr.send();
93162
+ if (xhr.status < 200 || xhr.status >= 300) {
93163
+ throw new Error(`webread: HTTP ${xhr.status} for ${url}`);
93164
+ }
93165
+ return xhr.responseText;
93166
+ }
93167
+ unzip(zipfilename, outputfolder) {
93168
+ zipfilename = filterUrl(zipfilename);
93169
+ const zipData = this.vfs.readFile(zipfilename);
93170
+ this.vfs.mkdir(outputfolder);
93171
+ const files = unzipSync(zipData);
93172
+ const extracted = [];
93173
+ for (const [entryName, fileData] of Object.entries(files)) {
93174
+ if (entryName.endsWith("/")) {
93175
+ this.vfs.mkdir(outputfolder + "/" + entryName);
93176
+ continue;
93177
+ }
93178
+ const outPath = outputfolder + "/" + entryName;
93179
+ const lastSlash = outPath.lastIndexOf("/");
93180
+ if (lastSlash > 0) {
93181
+ this.vfs.mkdir(outPath.slice(0, lastSlash));
93182
+ }
93183
+ this.vfs.writeFile(outPath, fileData);
93184
+ extracted.push(this.vfs.normalizePath(outPath));
93185
+ }
93186
+ return extracted;
93187
+ }
93188
+ /** Get the VFS changes for syncing back to the main thread. */
93189
+ getChanges() {
93190
+ for (const [, entry] of this.openFiles) {
93191
+ this.flushEntry(entry);
93192
+ }
93193
+ return this.vfs.getChanges();
93194
+ }
93195
+ getEntry(fid) {
93196
+ return this.openFiles.get(fid);
93197
+ }
93198
+ flushEntry(entry) {
93199
+ if (entry.dirty) {
93200
+ const finalData = entry.dataLen === entry.data.length ? entry.data : entry.data.subarray(0, entry.dataLen);
93201
+ this.vfs.writeFile(entry.path, finalData);
93202
+ entry.dirty = false;
93203
+ }
93204
+ }
93205
+ writeBytes(entry, bytes) {
93206
+ const needed = entry.pos + bytes.length;
93207
+ if (needed > entry.data.length) {
93208
+ const newSize = Math.max(needed, entry.data.length * 2, 256);
93209
+ const newData = new Uint8Array(newSize);
93210
+ newData.set(entry.data.subarray(0, entry.dataLen));
93211
+ entry.data = newData;
93212
+ }
93213
+ entry.data.set(bytes, entry.pos);
93214
+ entry.pos += bytes.length;
93215
+ if (entry.pos > entry.dataLen) {
93216
+ entry.dataLen = entry.pos;
93217
+ }
93218
+ entry.dirty = true;
93219
+ }
93220
+ /**
93221
+ * `entry.pos` stays the logical (consumed) byte position: the text buffer
93222
+ * holds the bytes starting at `entry.pos`, and consuming a line advances
93223
+ * `entry.pos` by its byte length. This keeps fgetl/fgets coherent with
93224
+ * freadBytes/fseek/ftell (and fscanf, which mixes the two).
93225
+ */
93226
+ readLine(entry, keepNewline) {
93227
+ while (!entry.eof) {
93228
+ const nlIdx2 = entry.buffer.indexOf("\n");
93229
+ if (nlIdx2 !== -1) break;
93230
+ const bufStart = entry.pos + TEXT_ENCODER.encode(entry.buffer).length;
93231
+ const available = entry.dataLen - bufStart;
93232
+ if (available <= 0) {
93233
+ entry.eof = true;
93234
+ break;
93235
+ }
93236
+ const toRead = Math.min(READ_CHUNK_SIZE, available);
93237
+ const chunk = entry.data.subarray(bufStart, bufStart + toRead);
93238
+ entry.buffer += TEXT_DECODER.decode(chunk, { stream: true });
93239
+ }
93240
+ if (entry.buffer.length === 0) {
93241
+ return -1;
93242
+ }
93243
+ const nlIdx = entry.buffer.indexOf("\n");
93244
+ if (nlIdx !== -1) {
93245
+ const consumed = entry.buffer.slice(0, nlIdx + 1);
93246
+ const line2 = keepNewline ? consumed : entry.buffer.slice(0, nlIdx);
93247
+ entry.buffer = entry.buffer.slice(nlIdx + 1);
93248
+ entry.pos += TEXT_ENCODER.encode(consumed).length;
93249
+ return line2;
93250
+ }
93251
+ const line = entry.buffer;
93252
+ entry.buffer = "";
93253
+ entry.pos += TEXT_ENCODER.encode(line).length;
93254
+ return line;
93255
+ }
93256
+ listDirGlob(pattern) {
93257
+ const norm2 = this.vfs.normalizePath(pattern);
93258
+ const lastSlash = norm2.lastIndexOf("/");
93259
+ const dir = lastSlash >= 0 ? norm2.slice(0, lastSlash) : "/";
93260
+ const globPat = lastSlash >= 0 ? norm2.slice(lastSlash + 1) : norm2;
93261
+ const re = new RegExp(
93262
+ "^" + globPat.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".") + "$"
93263
+ );
93264
+ const entries = this.vfs.listDir(dir);
93265
+ return entries.filter(
93266
+ (e) => e.name !== "." && e.name !== ".." && re.test(e.name)
93267
+ );
93268
+ }
93269
+ listDirRecursive(pattern) {
93270
+ const idx = pattern.indexOf("**");
93271
+ let baseDir = pattern.slice(0, idx);
93272
+ if (baseDir.endsWith("/")) baseDir = baseDir.slice(0, -1);
93273
+ if (!baseDir) baseDir = ".";
93274
+ const results = [];
93275
+ const walkDir = (dir) => {
93276
+ const entries = this.vfs.listDir(dir);
93277
+ results.push(...entries);
93278
+ for (const entry of entries) {
93279
+ if (entry.isdir && entry.name !== "." && entry.name !== "..") {
93280
+ walkDir(entry.folder + "/" + entry.name);
93281
+ }
93282
+ }
93283
+ };
93284
+ walkDir(this.vfs.normalizePath(baseDir));
93285
+ return results;
93286
+ }
93287
+ };
93288
+ function filterUrl(url) {
93289
+ if (/^https:\/\/github\.com\/.+\/releases\/download\/.+/.test(url)) {
93290
+ url = url.replace(
93291
+ "https://github.com/",
93292
+ "https://mip-cors-proxy.figurl.workers.dev/gh/"
93293
+ );
93294
+ url += url.includes("?") ? "&" : "?";
93295
+ url += "t=" + Date.now();
93296
+ }
93297
+ return url;
93298
+ }
93299
+
93300
+ // src/vfs/BrowserSystemAdapter.ts
93301
+ var BrowserSystemAdapter = class {
93302
+ vars = /* @__PURE__ */ new Map();
93303
+ vfs = null;
93304
+ // Used only when no VFS is attached (e.g. tests that don't need files).
93305
+ fallbackCwd = "/";
93306
+ constructor(vfs) {
93307
+ if (vfs) this.vfs = vfs;
93308
+ }
93309
+ /** Attach (or replace) the VFS used as the cwd source of truth. */
93310
+ setVfs(vfs) {
93311
+ this.vfs = vfs;
93312
+ }
93313
+ getEnv(name) {
93314
+ return this.vars.get(name);
93315
+ }
93316
+ getAllEnv() {
93317
+ const result = {};
93318
+ for (const [k, v] of this.vars) {
93319
+ result[k] = v;
93320
+ }
93321
+ return result;
93322
+ }
93323
+ setEnv(name, value) {
93324
+ this.vars.set(name, value);
93325
+ }
93326
+ cwd() {
93327
+ return this.vfs ? this.vfs.getCwd() : this.fallbackCwd;
93328
+ }
93329
+ chdir(dir) {
93330
+ if (this.vfs) {
93331
+ this.vfs.setCwd(dir);
93332
+ } else {
93333
+ this.fallbackCwd = dir.startsWith("/") ? dir : this.fallbackCwd.replace(/\/$/, "") + "/" + dir;
93334
+ }
93335
+ }
93336
+ platform() {
93337
+ return "linux";
93338
+ }
93339
+ arch() {
93340
+ return "x64";
93341
+ }
93342
+ };
91328
93343
  export {
93344
+ BrowserFileIOAdapter,
93345
+ BrowserSystemAdapter,
91329
93346
  RTV,
91330
93347
  RuntimeError,
93348
+ VirtualFileSystem,
91331
93349
  displayValue,
91332
93350
  executeCode,
91333
93351
  loadQhullNodeBackend as loadDelaunayBackend,