@fairyhunter13/opentui-core 0.1.88 → 0.1.90

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 (570) hide show
  1. package/dev/keypress-debug-renderer.ts +148 -0
  2. package/dev/keypress-debug.ts +43 -0
  3. package/dev/print-env-vars.ts +32 -0
  4. package/dev/test-tmux-graphics-334.sh +68 -0
  5. package/dev/thai-debug-test.ts +68 -0
  6. package/docs/development.md +141 -0
  7. package/docs/env-vars.md +140 -0
  8. package/docs/getting-started.md +353 -0
  9. package/docs/renderables-vs-constructs.md +159 -0
  10. package/docs/tree-sitter.md +311 -0
  11. package/package.json +61 -52
  12. package/scripts/build.ts +400 -0
  13. package/scripts/publish.ts +60 -0
  14. package/src/3d/SpriteResourceManager.ts +286 -0
  15. package/src/3d/SpriteUtils.ts +71 -0
  16. package/src/3d/TextureUtils.ts +196 -0
  17. package/src/3d/ThreeRenderable.ts +197 -0
  18. package/src/3d/WGPURenderer.ts +294 -0
  19. package/src/3d/animation/ExplodingSpriteEffect.ts +513 -0
  20. package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +429 -0
  21. package/src/3d/animation/SpriteAnimator.ts +633 -0
  22. package/src/3d/animation/SpriteParticleGenerator.ts +435 -0
  23. package/src/3d/canvas.ts +464 -0
  24. package/src/3d/index.ts +12 -0
  25. package/src/3d/physics/PlanckPhysicsAdapter.ts +72 -0
  26. package/src/3d/physics/RapierPhysicsAdapter.ts +66 -0
  27. package/src/3d/physics/physics-interface.ts +31 -0
  28. package/src/3d/shaders/supersampling.wgsl +201 -0
  29. package/src/3d.ts +3 -0
  30. package/src/NativeSpanFeed.ts +300 -0
  31. package/src/Renderable.ts +1698 -0
  32. package/src/__snapshots__/buffer.test.ts.snap +28 -0
  33. package/src/animation/Timeline.test.ts +2709 -0
  34. package/src/animation/Timeline.ts +598 -0
  35. package/src/ansi.ts +18 -0
  36. package/src/benchmark/latest-all-bench-run.json +707 -0
  37. package/src/benchmark/latest-async-bench-run.json +336 -0
  38. package/src/benchmark/latest-default-bench-run.json +657 -0
  39. package/src/benchmark/latest-large-bench-run.json +707 -0
  40. package/src/benchmark/latest-quick-bench-run.json +207 -0
  41. package/src/benchmark/markdown-benchmark.ts +1804 -0
  42. package/src/benchmark/native-span-feed-async-benchmark.ts +355 -0
  43. package/src/benchmark/native-span-feed-benchmark.md +56 -0
  44. package/src/benchmark/native-span-feed-benchmark.ts +596 -0
  45. package/src/benchmark/native-span-feed-compare.ts +280 -0
  46. package/src/benchmark/renderer-benchmark.ts +754 -0
  47. package/src/benchmark/text-table-benchmark.ts +947 -0
  48. package/src/buffer.test.ts +291 -0
  49. package/src/buffer.ts +519 -0
  50. package/src/console.test.ts +612 -0
  51. package/src/console.ts +1255 -0
  52. package/src/edit-buffer.test.ts +1769 -0
  53. package/src/edit-buffer.ts +411 -0
  54. package/src/editor-view.test.ts +1032 -0
  55. package/src/editor-view.ts +284 -0
  56. package/src/examples/ascii-font-selection-demo.ts +245 -0
  57. package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
  58. package/src/examples/assets/concrete.png +0 -0
  59. package/src/examples/assets/crate.png +0 -0
  60. package/src/examples/assets/crate_emissive.png +0 -0
  61. package/src/examples/assets/forrest_background.png +0 -0
  62. package/src/examples/assets/hast-example.json +1018 -0
  63. package/src/examples/assets/heart.png +0 -0
  64. package/src/examples/assets/main_char_heavy_attack.png +0 -0
  65. package/src/examples/assets/main_char_idle.png +0 -0
  66. package/src/examples/assets/main_char_jump_end.png +0 -0
  67. package/src/examples/assets/main_char_jump_landing.png +0 -0
  68. package/src/examples/assets/main_char_jump_start.png +0 -0
  69. package/src/examples/assets/main_char_run_loop.png +0 -0
  70. package/src/examples/assets/roughness_map.jpg +0 -0
  71. package/src/examples/build.ts +115 -0
  72. package/src/examples/code-demo.ts +584 -0
  73. package/src/examples/console-demo.ts +358 -0
  74. package/src/examples/core-plugin-slots-demo.ts +759 -0
  75. package/src/examples/diff-demo.ts +699 -0
  76. package/src/examples/draggable-three-demo.ts +259 -0
  77. package/src/examples/editor-demo.ts +322 -0
  78. package/src/examples/extmarks-demo.ts +204 -0
  79. package/src/examples/focus-restore-demo.ts +310 -0
  80. package/src/examples/fonts.ts +245 -0
  81. package/src/examples/fractal-shader-demo.ts +268 -0
  82. package/src/examples/framebuffer-demo.ts +674 -0
  83. package/src/examples/full-unicode-demo.ts +181 -0
  84. package/src/examples/golden-star-demo.ts +933 -0
  85. package/src/examples/grayscale-buffer-demo.ts +249 -0
  86. package/src/examples/hast-syntax-highlighting-demo.ts +129 -0
  87. package/src/examples/index.ts +925 -0
  88. package/src/examples/input-demo.ts +377 -0
  89. package/src/examples/input-select-layout-demo.ts +425 -0
  90. package/src/examples/install.sh +143 -0
  91. package/src/examples/keypress-debug-demo.ts +452 -0
  92. package/src/examples/lib/HexList.ts +122 -0
  93. package/src/examples/lib/PaletteGrid.ts +125 -0
  94. package/src/examples/lib/standalone-keys.ts +25 -0
  95. package/src/examples/lib/tab-controller.ts +243 -0
  96. package/src/examples/lights-phong-demo.ts +290 -0
  97. package/src/examples/link-demo.ts +220 -0
  98. package/src/examples/live-state-demo.ts +480 -0
  99. package/src/examples/markdown-demo.ts +620 -0
  100. package/src/examples/mouse-interaction-demo.ts +428 -0
  101. package/src/examples/nested-zindex-demo.ts +357 -0
  102. package/src/examples/opacity-example.ts +235 -0
  103. package/src/examples/opentui-demo.ts +1057 -0
  104. package/src/examples/physx-planck-2d-demo.ts +507 -0
  105. package/src/examples/physx-rapier-2d-demo.ts +526 -0
  106. package/src/examples/relative-positioning-demo.ts +323 -0
  107. package/src/examples/scroll-example.ts +214 -0
  108. package/src/examples/scrollbox-mouse-test.ts +112 -0
  109. package/src/examples/scrollbox-overlay-hit-test.ts +206 -0
  110. package/src/examples/select-demo.ts +237 -0
  111. package/src/examples/shader-cube-demo.ts +772 -0
  112. package/src/examples/simple-layout-example.ts +591 -0
  113. package/src/examples/slider-demo.ts +617 -0
  114. package/src/examples/split-mode-demo.ts +445 -0
  115. package/src/examples/sprite-animation-demo.ts +443 -0
  116. package/src/examples/sprite-particle-generator-demo.ts +486 -0
  117. package/src/examples/static-sprite-demo.ts +193 -0
  118. package/src/examples/sticky-scroll-example.ts +308 -0
  119. package/src/examples/styled-text-demo.ts +282 -0
  120. package/src/examples/tab-select-demo.ts +219 -0
  121. package/src/examples/terminal-title.ts +29 -0
  122. package/src/examples/terminal.ts +305 -0
  123. package/src/examples/text-node-demo.ts +416 -0
  124. package/src/examples/text-selection-demo.ts +377 -0
  125. package/src/examples/text-table-demo.ts +503 -0
  126. package/src/examples/text-truncation-demo.ts +481 -0
  127. package/src/examples/text-wrap.ts +757 -0
  128. package/src/examples/texture-loading-demo.ts +259 -0
  129. package/src/examples/timeline-example.ts +670 -0
  130. package/src/examples/transparency-demo.ts +241 -0
  131. package/src/examples/vnode-composition-demo.ts +404 -0
  132. package/src/index.ts +22 -0
  133. package/src/lib/KeyHandler.integration.test.ts +292 -0
  134. package/src/lib/KeyHandler.stopPropagation.test.ts +289 -0
  135. package/src/lib/KeyHandler.test.ts +662 -0
  136. package/src/lib/KeyHandler.ts +222 -0
  137. package/src/lib/RGBA.test.ts +984 -0
  138. package/src/lib/RGBA.ts +204 -0
  139. package/src/lib/ascii.font.ts +330 -0
  140. package/src/lib/border.test.ts +83 -0
  141. package/src/lib/border.ts +168 -0
  142. package/src/lib/bunfs.test.ts +27 -0
  143. package/src/lib/bunfs.ts +18 -0
  144. package/src/lib/clipboard.test.ts +41 -0
  145. package/src/lib/clipboard.ts +47 -0
  146. package/src/lib/clock.ts +31 -0
  147. package/src/lib/data-paths.test.ts +133 -0
  148. package/src/lib/data-paths.ts +109 -0
  149. package/src/lib/debounce.ts +106 -0
  150. package/src/lib/detect-links.test.ts +98 -0
  151. package/src/lib/detect-links.ts +56 -0
  152. package/src/lib/env.test.ts +228 -0
  153. package/src/lib/env.ts +209 -0
  154. package/src/lib/extmarks-history.ts +51 -0
  155. package/src/lib/extmarks-multiwidth.test.ts +322 -0
  156. package/src/lib/extmarks.test.ts +3457 -0
  157. package/src/lib/extmarks.ts +843 -0
  158. package/src/lib/fonts/block.json +405 -0
  159. package/src/lib/fonts/grid.json +265 -0
  160. package/src/lib/fonts/huge.json +741 -0
  161. package/src/lib/fonts/pallet.json +314 -0
  162. package/src/lib/fonts/shade.json +591 -0
  163. package/src/lib/fonts/slick.json +321 -0
  164. package/src/lib/fonts/tiny.json +69 -0
  165. package/src/lib/hast-styled-text.ts +59 -0
  166. package/src/lib/index.ts +21 -0
  167. package/src/lib/keymapping.test.ts +280 -0
  168. package/src/lib/keymapping.ts +87 -0
  169. package/src/lib/objects-in-viewport.test.ts +787 -0
  170. package/src/lib/objects-in-viewport.ts +153 -0
  171. package/src/lib/output.capture.ts +58 -0
  172. package/src/lib/parse.keypress-kitty.protocol.test.ts +340 -0
  173. package/src/lib/parse.keypress-kitty.test.ts +663 -0
  174. package/src/lib/parse.keypress-kitty.ts +439 -0
  175. package/src/lib/parse.keypress.test.ts +1849 -0
  176. package/src/lib/parse.keypress.ts +397 -0
  177. package/src/lib/parse.mouse.test.ts +552 -0
  178. package/src/lib/parse.mouse.ts +232 -0
  179. package/src/lib/paste.ts +16 -0
  180. package/src/lib/queue.ts +65 -0
  181. package/src/lib/renderable.validations.test.ts +87 -0
  182. package/src/lib/renderable.validations.ts +83 -0
  183. package/src/lib/scroll-acceleration.ts +98 -0
  184. package/src/lib/selection.ts +240 -0
  185. package/src/lib/singleton.ts +28 -0
  186. package/src/lib/stdin-parser.test.ts +1676 -0
  187. package/src/lib/stdin-parser.ts +1248 -0
  188. package/src/lib/styled-text.ts +178 -0
  189. package/src/lib/terminal-capability-detection.test.ts +202 -0
  190. package/src/lib/terminal-capability-detection.ts +79 -0
  191. package/src/lib/terminal-palette.test.ts +878 -0
  192. package/src/lib/terminal-palette.ts +383 -0
  193. package/src/lib/tree-sitter/assets/README.md +118 -0
  194. package/src/lib/tree-sitter/assets/update.ts +331 -0
  195. package/src/lib/tree-sitter/assets.d.ts +9 -0
  196. package/src/lib/tree-sitter/cache.test.ts +270 -0
  197. package/src/lib/tree-sitter/client.test.ts +1061 -0
  198. package/src/lib/tree-sitter/client.ts +615 -0
  199. package/src/lib/tree-sitter/default-parsers.ts +80 -0
  200. package/src/lib/tree-sitter/download-utils.ts +148 -0
  201. package/src/lib/tree-sitter/index.ts +28 -0
  202. package/src/lib/tree-sitter/parser.worker.ts +1001 -0
  203. package/src/lib/tree-sitter/parsers-config.ts +75 -0
  204. package/src/lib/tree-sitter/resolve-ft.ts +62 -0
  205. package/src/lib/tree-sitter/types.ts +81 -0
  206. package/src/lib/tree-sitter-styled-text.test.ts +1253 -0
  207. package/src/lib/tree-sitter-styled-text.ts +306 -0
  208. package/src/lib/validate-dir-name.ts +55 -0
  209. package/src/lib/yoga.options.test.ts +628 -0
  210. package/src/lib/yoga.options.ts +346 -0
  211. package/src/plugins/core-slot.ts +579 -0
  212. package/src/plugins/registry.ts +377 -0
  213. package/src/plugins/types.ts +46 -0
  214. package/src/post/filters.ts +888 -0
  215. package/src/renderables/ASCIIFont.ts +219 -0
  216. package/src/renderables/Box.test.ts +160 -0
  217. package/src/renderables/Box.ts +295 -0
  218. package/src/renderables/Code.test.ts +2062 -0
  219. package/src/renderables/Code.ts +357 -0
  220. package/src/renderables/Diff.regression.test.ts +226 -0
  221. package/src/renderables/Diff.test.ts +3027 -0
  222. package/src/renderables/Diff.ts +1209 -0
  223. package/src/renderables/EditBufferRenderable.ts +764 -0
  224. package/src/renderables/FrameBuffer.ts +47 -0
  225. package/src/renderables/Input.test.ts +1228 -0
  226. package/src/renderables/Input.ts +245 -0
  227. package/src/renderables/LineNumberRenderable.ts +675 -0
  228. package/src/renderables/Markdown.ts +1106 -0
  229. package/src/renderables/ScrollBar.ts +422 -0
  230. package/src/renderables/ScrollBox.ts +883 -0
  231. package/src/renderables/Select.test.ts +1010 -0
  232. package/src/renderables/Select.ts +523 -0
  233. package/src/renderables/Slider.test.ts +456 -0
  234. package/src/renderables/Slider.ts +347 -0
  235. package/src/renderables/TabSelect.test.ts +197 -0
  236. package/src/renderables/TabSelect.ts +455 -0
  237. package/src/renderables/Text.selection-buffer.test.ts +123 -0
  238. package/src/renderables/Text.test.ts +2660 -0
  239. package/src/renderables/Text.ts +147 -0
  240. package/src/renderables/TextBufferRenderable.ts +518 -0
  241. package/src/renderables/TextNode.test.ts +1058 -0
  242. package/src/renderables/TextNode.ts +325 -0
  243. package/src/renderables/TextTable.test.ts +1421 -0
  244. package/src/renderables/TextTable.ts +1344 -0
  245. package/src/renderables/Textarea.ts +732 -0
  246. package/src/renderables/TimeToFirstDraw.ts +89 -0
  247. package/src/renderables/__snapshots__/Code.test.ts.snap +13 -0
  248. package/src/renderables/__snapshots__/Diff.test.ts.snap +785 -0
  249. package/src/renderables/__snapshots__/Text.test.ts.snap +421 -0
  250. package/src/renderables/__snapshots__/TextTable.test.ts.snap +215 -0
  251. package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +144 -0
  252. package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +816 -0
  253. package/src/renderables/__tests__/LineNumberRenderable.test.ts +1787 -0
  254. package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +85 -0
  255. package/src/renderables/__tests__/Markdown.test.ts +2287 -0
  256. package/src/renderables/__tests__/MultiRenderable.selection.test.ts +87 -0
  257. package/src/renderables/__tests__/Textarea.buffer.test.ts +682 -0
  258. package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +675 -0
  259. package/src/renderables/__tests__/Textarea.editing.test.ts +2041 -0
  260. package/src/renderables/__tests__/Textarea.error-handling.test.ts +35 -0
  261. package/src/renderables/__tests__/Textarea.events.test.ts +738 -0
  262. package/src/renderables/__tests__/Textarea.highlights.test.ts +590 -0
  263. package/src/renderables/__tests__/Textarea.keybinding.test.ts +3149 -0
  264. package/src/renderables/__tests__/Textarea.paste.test.ts +357 -0
  265. package/src/renderables/__tests__/Textarea.rendering.test.ts +1864 -0
  266. package/src/renderables/__tests__/Textarea.scroll.test.ts +733 -0
  267. package/src/renderables/__tests__/Textarea.selection.test.ts +1590 -0
  268. package/src/renderables/__tests__/Textarea.stress.test.ts +670 -0
  269. package/src/renderables/__tests__/Textarea.undo-redo.test.ts +383 -0
  270. package/src/renderables/__tests__/Textarea.visual-lines.test.ts +310 -0
  271. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +221 -0
  272. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +89 -0
  273. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +457 -0
  274. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +158 -0
  275. package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +387 -0
  276. package/src/renderables/__tests__/markdown-parser.test.ts +217 -0
  277. package/src/renderables/__tests__/renderable-test-utils.ts +60 -0
  278. package/src/renderables/composition/README.md +8 -0
  279. package/src/renderables/composition/VRenderable.ts +32 -0
  280. package/src/renderables/composition/constructs.ts +127 -0
  281. package/src/renderables/composition/vnode.ts +289 -0
  282. package/src/renderables/index.ts +22 -0
  283. package/src/renderables/markdown-parser.ts +66 -0
  284. package/src/renderer.ts +2363 -0
  285. package/src/runtime-plugin-support.ts +39 -0
  286. package/src/runtime-plugin.ts +144 -0
  287. package/src/syntax-style.test.ts +841 -0
  288. package/src/syntax-style.ts +264 -0
  289. package/src/testing/README.md +210 -0
  290. package/src/testing/capture-spans.test.ts +194 -0
  291. package/src/testing/integration.test.ts +276 -0
  292. package/src/testing/manual-clock.ts +106 -0
  293. package/src/testing/mock-keys.test.ts +1356 -0
  294. package/src/testing/mock-keys.ts +449 -0
  295. package/src/testing/mock-mouse.test.ts +218 -0
  296. package/src/testing/mock-mouse.ts +247 -0
  297. package/src/testing/mock-tree-sitter-client.ts +73 -0
  298. package/src/testing/spy.ts +13 -0
  299. package/src/testing/test-recorder.test.ts +415 -0
  300. package/src/testing/test-recorder.ts +145 -0
  301. package/src/testing/test-renderer.ts +116 -0
  302. package/src/testing.ts +7 -0
  303. package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +481 -0
  304. package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +19 -0
  305. package/src/tests/__snapshots__/scrollbox.test.ts.snap +29 -0
  306. package/src/tests/absolute-positioning.snapshot.test.ts +638 -0
  307. package/src/tests/allocator-stats.test.ts +38 -0
  308. package/src/tests/destroy-during-render.test.ts +200 -0
  309. package/src/tests/hover-cursor.test.ts +98 -0
  310. package/src/tests/native-span-feed-async.test.ts +173 -0
  311. package/src/tests/native-span-feed-close.test.ts +120 -0
  312. package/src/tests/native-span-feed-coverage.test.ts +227 -0
  313. package/src/tests/native-span-feed-edge-cases.test.ts +352 -0
  314. package/src/tests/native-span-feed-use-after-free.test.ts +45 -0
  315. package/src/tests/opacity.test.ts +123 -0
  316. package/src/tests/renderable.snapshot.test.ts +524 -0
  317. package/src/tests/renderable.test.ts +1281 -0
  318. package/src/tests/renderer.console-startup.test.ts +65 -0
  319. package/src/tests/renderer.control.test.ts +364 -0
  320. package/src/tests/renderer.core-slot-binding.test.ts +952 -0
  321. package/src/tests/renderer.cursor.test.ts +26 -0
  322. package/src/tests/renderer.destroy-during-render.test.ts +110 -0
  323. package/src/tests/renderer.focus-restore.test.ts +228 -0
  324. package/src/tests/renderer.focus.test.ts +251 -0
  325. package/src/tests/renderer.idle.test.ts +219 -0
  326. package/src/tests/renderer.input.test.ts +2145 -0
  327. package/src/tests/renderer.kitty-flags.test.ts +195 -0
  328. package/src/tests/renderer.mouse.test.ts +1269 -0
  329. package/src/tests/renderer.palette.test.ts +629 -0
  330. package/src/tests/renderer.selection.test.ts +49 -0
  331. package/src/tests/renderer.slot-registry.test.ts +649 -0
  332. package/src/tests/renderer.useMouse.test.ts +50 -0
  333. package/src/tests/runtime-plugin-support.fixture.ts +11 -0
  334. package/src/tests/runtime-plugin-support.test.ts +28 -0
  335. package/src/tests/runtime-plugin.fixture.ts +40 -0
  336. package/src/tests/runtime-plugin.test.ts +190 -0
  337. package/src/tests/scrollbox-culling-bug.test.ts +114 -0
  338. package/src/tests/scrollbox-hitgrid-resize.test.ts +136 -0
  339. package/src/tests/scrollbox-hitgrid.test.ts +909 -0
  340. package/src/tests/scrollbox.test.ts +1530 -0
  341. package/src/tests/wrap-resize-perf.test.ts +229 -0
  342. package/src/tests/yoga-setters.test.ts +921 -0
  343. package/src/text-buffer-view.test.ts +705 -0
  344. package/src/text-buffer-view.ts +189 -0
  345. package/src/text-buffer.test.ts +347 -0
  346. package/src/text-buffer.ts +250 -0
  347. package/src/types.ts +152 -0
  348. package/src/utils.ts +88 -0
  349. package/src/zig/ansi.zig +268 -0
  350. package/src/zig/bench/README.md +50 -0
  351. package/src/zig/bench/buffer-draw-text-buffer_bench.zig +887 -0
  352. package/src/zig/bench/edit-buffer_bench.zig +476 -0
  353. package/src/zig/bench/native-span-feed_bench.zig +100 -0
  354. package/src/zig/bench/rope-markers_bench.zig +713 -0
  355. package/src/zig/bench/rope_bench.zig +514 -0
  356. package/src/zig/bench/styled-text_bench.zig +470 -0
  357. package/src/zig/bench/text-buffer-coords_bench.zig +362 -0
  358. package/src/zig/bench/text-buffer-view_bench.zig +459 -0
  359. package/src/zig/bench/text-chunk-graphemes_bench.zig +273 -0
  360. package/src/zig/bench/utf8_bench.zig +799 -0
  361. package/src/zig/bench-utils.zig +431 -0
  362. package/src/zig/bench.zig +217 -0
  363. package/src/zig/buffer.zig +2223 -0
  364. package/src/zig/build.zig +289 -0
  365. package/src/zig/build.zig.zon +16 -0
  366. package/src/zig/edit-buffer.zig +825 -0
  367. package/src/zig/editor-view.zig +802 -0
  368. package/src/zig/event-bus.zig +13 -0
  369. package/src/zig/event-emitter.zig +65 -0
  370. package/src/zig/file-logger.zig +92 -0
  371. package/src/zig/grapheme.zig +599 -0
  372. package/src/zig/lib.zig +1834 -0
  373. package/src/zig/link.zig +333 -0
  374. package/src/zig/logger.zig +43 -0
  375. package/src/zig/mem-registry.zig +125 -0
  376. package/src/zig/native-span-feed-bench-lib.zig +7 -0
  377. package/src/zig/native-span-feed.zig +708 -0
  378. package/src/zig/renderer.zig +1386 -0
  379. package/src/zig/rope.zig +1220 -0
  380. package/src/zig/syntax-style.zig +161 -0
  381. package/src/zig/terminal.zig +975 -0
  382. package/src/zig/test.zig +70 -0
  383. package/src/zig/tests/README.md +18 -0
  384. package/src/zig/tests/buffer_test.zig +2526 -0
  385. package/src/zig/tests/edit-buffer-history_test.zig +271 -0
  386. package/src/zig/tests/edit-buffer_test.zig +1689 -0
  387. package/src/zig/tests/editor-view_test.zig +3299 -0
  388. package/src/zig/tests/event-emitter_test.zig +249 -0
  389. package/src/zig/tests/grapheme_test.zig +1304 -0
  390. package/src/zig/tests/link_test.zig +190 -0
  391. package/src/zig/tests/mem-registry_test.zig +473 -0
  392. package/src/zig/tests/memory_leak_regression_test.zig +159 -0
  393. package/src/zig/tests/native-span-feed_test.zig +1264 -0
  394. package/src/zig/tests/renderer_test.zig +1010 -0
  395. package/src/zig/tests/rope-nested_test.zig +712 -0
  396. package/src/zig/tests/rope_fuzz_test.zig +238 -0
  397. package/src/zig/tests/rope_test.zig +2362 -0
  398. package/src/zig/tests/segment-merge.test.zig +148 -0
  399. package/src/zig/tests/syntax-style_test.zig +557 -0
  400. package/src/zig/tests/terminal_test.zig +719 -0
  401. package/src/zig/tests/text-buffer-drawing_test.zig +3237 -0
  402. package/src/zig/tests/text-buffer-highlights_test.zig +666 -0
  403. package/src/zig/tests/text-buffer-iterators_test.zig +776 -0
  404. package/src/zig/tests/text-buffer-segment_test.zig +320 -0
  405. package/src/zig/tests/text-buffer-selection_test.zig +1035 -0
  406. package/src/zig/tests/text-buffer-selection_viewport_test.zig +358 -0
  407. package/src/zig/tests/text-buffer-view_test.zig +3649 -0
  408. package/src/zig/tests/text-buffer_test.zig +2191 -0
  409. package/src/zig/tests/unicode-width-map.zon +3909 -0
  410. package/src/zig/tests/utf8_no_zwj_test.zig +260 -0
  411. package/src/zig/tests/utf8_test.zig +4057 -0
  412. package/src/zig/tests/utf8_wcwidth_cursor_test.zig +267 -0
  413. package/src/zig/tests/utf8_wcwidth_test.zig +357 -0
  414. package/src/zig/tests/word-wrap-editing_test.zig +498 -0
  415. package/src/zig/tests/wrap-cache-perf_test.zig +113 -0
  416. package/src/zig/text-buffer-iterators.zig +499 -0
  417. package/src/zig/text-buffer-segment.zig +404 -0
  418. package/src/zig/text-buffer-view.zig +1371 -0
  419. package/src/zig/text-buffer.zig +1180 -0
  420. package/src/zig/utf8.zig +1948 -0
  421. package/src/zig/utils.zig +9 -0
  422. package/src/zig-structs.ts +261 -0
  423. package/src/zig.ts +3843 -0
  424. package/tsconfig.build.json +22 -0
  425. package/tsconfig.json +28 -0
  426. package/3d/SpriteResourceManager.d.ts +0 -74
  427. package/3d/SpriteUtils.d.ts +0 -13
  428. package/3d/TextureUtils.d.ts +0 -24
  429. package/3d/ThreeRenderable.d.ts +0 -40
  430. package/3d/WGPURenderer.d.ts +0 -61
  431. package/3d/animation/ExplodingSpriteEffect.d.ts +0 -71
  432. package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +0 -76
  433. package/3d/animation/SpriteAnimator.d.ts +0 -124
  434. package/3d/animation/SpriteParticleGenerator.d.ts +0 -62
  435. package/3d/canvas.d.ts +0 -44
  436. package/3d/index.d.ts +0 -12
  437. package/3d/physics/PlanckPhysicsAdapter.d.ts +0 -19
  438. package/3d/physics/RapierPhysicsAdapter.d.ts +0 -19
  439. package/3d/physics/physics-interface.d.ts +0 -27
  440. package/3d.d.ts +0 -2
  441. package/3d.js +0 -34042
  442. package/3d.js.map +0 -155
  443. package/LICENSE +0 -21
  444. package/NativeSpanFeed.d.ts +0 -41
  445. package/Renderable.d.ts +0 -334
  446. package/animation/Timeline.d.ts +0 -126
  447. package/ansi.d.ts +0 -13
  448. package/buffer.d.ts +0 -107
  449. package/console.d.ts +0 -143
  450. package/edit-buffer.d.ts +0 -98
  451. package/editor-view.d.ts +0 -73
  452. package/index-e4hzc2j2.js +0 -113
  453. package/index-e4hzc2j2.js.map +0 -10
  454. package/index-nkrr8a4c.js +0 -18415
  455. package/index-nkrr8a4c.js.map +0 -64
  456. package/index-nyw5p3ep.js +0 -12619
  457. package/index-nyw5p3ep.js.map +0 -43
  458. package/index.d.ts +0 -21
  459. package/index.js +0 -430
  460. package/index.js.map +0 -9
  461. package/lib/KeyHandler.d.ts +0 -61
  462. package/lib/RGBA.d.ts +0 -25
  463. package/lib/ascii.font.d.ts +0 -508
  464. package/lib/border.d.ts +0 -49
  465. package/lib/bunfs.d.ts +0 -7
  466. package/lib/clipboard.d.ts +0 -17
  467. package/lib/clock.d.ts +0 -15
  468. package/lib/data-paths.d.ts +0 -26
  469. package/lib/debounce.d.ts +0 -42
  470. package/lib/detect-links.d.ts +0 -6
  471. package/lib/env.d.ts +0 -42
  472. package/lib/extmarks-history.d.ts +0 -17
  473. package/lib/extmarks.d.ts +0 -89
  474. package/lib/hast-styled-text.d.ts +0 -17
  475. package/lib/index.d.ts +0 -21
  476. package/lib/keymapping.d.ts +0 -25
  477. package/lib/objects-in-viewport.d.ts +0 -24
  478. package/lib/output.capture.d.ts +0 -24
  479. package/lib/parse.keypress-kitty.d.ts +0 -2
  480. package/lib/parse.keypress.d.ts +0 -26
  481. package/lib/parse.mouse.d.ts +0 -30
  482. package/lib/paste.d.ts +0 -7
  483. package/lib/queue.d.ts +0 -15
  484. package/lib/renderable.validations.d.ts +0 -12
  485. package/lib/scroll-acceleration.d.ts +0 -43
  486. package/lib/selection.d.ts +0 -63
  487. package/lib/singleton.d.ts +0 -7
  488. package/lib/stdin-parser.d.ts +0 -76
  489. package/lib/styled-text.d.ts +0 -63
  490. package/lib/terminal-capability-detection.d.ts +0 -30
  491. package/lib/terminal-palette.d.ts +0 -50
  492. package/lib/tree-sitter/assets/update.d.ts +0 -11
  493. package/lib/tree-sitter/client.d.ts +0 -47
  494. package/lib/tree-sitter/default-parsers.d.ts +0 -2
  495. package/lib/tree-sitter/download-utils.d.ts +0 -21
  496. package/lib/tree-sitter/index.d.ts +0 -8
  497. package/lib/tree-sitter/parser.worker.d.ts +0 -1
  498. package/lib/tree-sitter/parsers-config.d.ts +0 -38
  499. package/lib/tree-sitter/resolve-ft.d.ts +0 -2
  500. package/lib/tree-sitter/types.d.ts +0 -81
  501. package/lib/tree-sitter-styled-text.d.ts +0 -14
  502. package/lib/validate-dir-name.d.ts +0 -1
  503. package/lib/yoga.options.d.ts +0 -32
  504. package/parser.worker.js +0 -869
  505. package/parser.worker.js.map +0 -12
  506. package/plugins/core-slot.d.ts +0 -72
  507. package/plugins/registry.d.ts +0 -38
  508. package/plugins/types.d.ts +0 -34
  509. package/post/filters.d.ts +0 -105
  510. package/renderables/ASCIIFont.d.ts +0 -52
  511. package/renderables/Box.d.ts +0 -72
  512. package/renderables/Code.d.ts +0 -78
  513. package/renderables/Diff.d.ts +0 -142
  514. package/renderables/EditBufferRenderable.d.ts +0 -162
  515. package/renderables/FrameBuffer.d.ts +0 -16
  516. package/renderables/Input.d.ts +0 -67
  517. package/renderables/LineNumberRenderable.d.ts +0 -74
  518. package/renderables/Markdown.d.ts +0 -173
  519. package/renderables/ScrollBar.d.ts +0 -77
  520. package/renderables/ScrollBox.d.ts +0 -124
  521. package/renderables/Select.d.ts +0 -115
  522. package/renderables/Slider.d.ts +0 -44
  523. package/renderables/TabSelect.d.ts +0 -96
  524. package/renderables/Text.d.ts +0 -36
  525. package/renderables/TextBufferRenderable.d.ts +0 -105
  526. package/renderables/TextNode.d.ts +0 -91
  527. package/renderables/TextTable.d.ts +0 -140
  528. package/renderables/Textarea.d.ts +0 -114
  529. package/renderables/TimeToFirstDraw.d.ts +0 -24
  530. package/renderables/__tests__/renderable-test-utils.d.ts +0 -12
  531. package/renderables/composition/VRenderable.d.ts +0 -16
  532. package/renderables/composition/constructs.d.ts +0 -35
  533. package/renderables/composition/vnode.d.ts +0 -46
  534. package/renderables/index.d.ts +0 -22
  535. package/renderables/markdown-parser.d.ts +0 -10
  536. package/renderer.d.ts +0 -388
  537. package/runtime-plugin-support.d.ts +0 -3
  538. package/runtime-plugin-support.js +0 -29
  539. package/runtime-plugin-support.js.map +0 -10
  540. package/runtime-plugin.d.ts +0 -11
  541. package/runtime-plugin.js +0 -16
  542. package/runtime-plugin.js.map +0 -9
  543. package/syntax-style.d.ts +0 -54
  544. package/testing/manual-clock.d.ts +0 -16
  545. package/testing/mock-keys.d.ts +0 -81
  546. package/testing/mock-mouse.d.ts +0 -38
  547. package/testing/mock-tree-sitter-client.d.ts +0 -23
  548. package/testing/spy.d.ts +0 -7
  549. package/testing/test-recorder.d.ts +0 -61
  550. package/testing/test-renderer.d.ts +0 -23
  551. package/testing.d.ts +0 -6
  552. package/testing.js +0 -675
  553. package/testing.js.map +0 -15
  554. package/text-buffer-view.d.ts +0 -42
  555. package/text-buffer.d.ts +0 -67
  556. package/types.d.ts +0 -131
  557. package/utils.d.ts +0 -14
  558. package/zig-structs.d.ts +0 -155
  559. package/zig.d.ts +0 -351
  560. /package/{assets → src/lib/tree-sitter/assets}/javascript/highlights.scm +0 -0
  561. /package/{assets → src/lib/tree-sitter/assets}/javascript/tree-sitter-javascript.wasm +0 -0
  562. /package/{assets → src/lib/tree-sitter/assets}/markdown/highlights.scm +0 -0
  563. /package/{assets → src/lib/tree-sitter/assets}/markdown/injections.scm +0 -0
  564. /package/{assets → src/lib/tree-sitter/assets}/markdown/tree-sitter-markdown.wasm +0 -0
  565. /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/highlights.scm +0 -0
  566. /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
  567. /package/{assets → src/lib/tree-sitter/assets}/typescript/highlights.scm +0 -0
  568. /package/{assets → src/lib/tree-sitter/assets}/typescript/tree-sitter-typescript.wasm +0 -0
  569. /package/{assets → src/lib/tree-sitter/assets}/zig/highlights.scm +0 -0
  570. /package/{assets → src/lib/tree-sitter/assets}/zig/tree-sitter-zig.wasm +0 -0
@@ -0,0 +1,476 @@
1
+ const std = @import("std");
2
+ const bench_utils = @import("../bench-utils.zig");
3
+ const edit_buffer = @import("../edit-buffer.zig");
4
+ const gp = @import("../grapheme.zig");
5
+ const link = @import("../link.zig");
6
+
7
+ const EditBuffer = edit_buffer.EditBuffer;
8
+ const BenchResult = bench_utils.BenchResult;
9
+ const BenchStats = bench_utils.BenchStats;
10
+ const MemStat = bench_utils.MemStat;
11
+
12
+ pub const benchName = "EditBuffer Operations";
13
+
14
+ fn benchInsertOperations(
15
+ allocator: std.mem.Allocator,
16
+ pool: *gp.GraphemePool,
17
+ iterations: usize,
18
+ show_mem: bool,
19
+ bench_filter: ?[]const u8,
20
+ ) ![]BenchResult {
21
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
22
+ errdefer results.deinit(allocator);
23
+ const link_pool = link.initGlobalLinkPool(allocator);
24
+
25
+ // Single-line insert at start
26
+ {
27
+ const name = "EditBuffer insert 1k times at start";
28
+ if (bench_utils.matchesBenchFilter(name, bench_filter)) {
29
+ var stats = BenchStats{};
30
+ var final_mem: usize = 0;
31
+
32
+ for (0..iterations) |iter| {
33
+ var eb = try EditBuffer.init(allocator, pool, link_pool, .unicode);
34
+ defer eb.deinit();
35
+
36
+ const text = "Hello, world! ";
37
+ var timer = try std.time.Timer.start();
38
+ for (0..1000) |_| {
39
+ try eb.insertText(text);
40
+ try eb.setCursor(0, 0);
41
+ }
42
+ stats.record(timer.read());
43
+
44
+ if (iter == iterations - 1 and show_mem) {
45
+ final_mem = eb.getTextBuffer().getArenaAllocatedBytes();
46
+ }
47
+ }
48
+
49
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
50
+ const s = try allocator.alloc(MemStat, 1);
51
+ s[0] = .{ .name = "TB", .bytes = final_mem };
52
+ break :blk s;
53
+ } else null;
54
+
55
+ try results.append(allocator, BenchResult{
56
+ .name = name,
57
+ .min_ns = stats.min_ns,
58
+ .avg_ns = stats.avg(),
59
+ .max_ns = stats.max_ns,
60
+ .total_ns = stats.total_ns,
61
+ .iterations = iterations,
62
+ .mem_stats = mem_stats,
63
+ });
64
+ }
65
+ }
66
+
67
+ // Multi-line insert
68
+ {
69
+ const name = "EditBuffer insert 500 multi-line blocks";
70
+ if (bench_utils.matchesBenchFilter(name, bench_filter)) {
71
+ var stats = BenchStats{};
72
+ var final_mem: usize = 0;
73
+
74
+ for (0..iterations) |iter| {
75
+ var eb = try EditBuffer.init(allocator, pool, link_pool, .unicode);
76
+ defer eb.deinit();
77
+
78
+ const text = "Line 1\nLine 2\nLine 3\n";
79
+ var timer = try std.time.Timer.start();
80
+ for (0..500) |_| {
81
+ try eb.insertText(text);
82
+ }
83
+ stats.record(timer.read());
84
+
85
+ if (iter == iterations - 1 and show_mem) {
86
+ final_mem = eb.getTextBuffer().getArenaAllocatedBytes();
87
+ }
88
+ }
89
+
90
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
91
+ const s = try allocator.alloc(MemStat, 1);
92
+ s[0] = .{ .name = "TB", .bytes = final_mem };
93
+ break :blk s;
94
+ } else null;
95
+
96
+ try results.append(allocator, BenchResult{
97
+ .name = name,
98
+ .min_ns = stats.min_ns,
99
+ .avg_ns = stats.avg(),
100
+ .max_ns = stats.max_ns,
101
+ .total_ns = stats.total_ns,
102
+ .iterations = iterations,
103
+ .mem_stats = mem_stats,
104
+ });
105
+ }
106
+ }
107
+
108
+ return try results.toOwnedSlice(allocator);
109
+ }
110
+
111
+ fn benchDeleteOperations(
112
+ allocator: std.mem.Allocator,
113
+ pool: *gp.GraphemePool,
114
+ iterations: usize,
115
+ show_mem: bool,
116
+ bench_filter: ?[]const u8,
117
+ ) ![]BenchResult {
118
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
119
+ errdefer results.deinit(allocator);
120
+ const link_pool = link.initGlobalLinkPool(allocator);
121
+
122
+ // Single-line delete with backspace
123
+ {
124
+ const name = "EditBuffer backspace 500 chars";
125
+ if (bench_utils.matchesBenchFilter(name, bench_filter)) {
126
+ var stats = BenchStats{};
127
+ var final_mem: usize = 0;
128
+
129
+ for (0..iterations) |iter| {
130
+ var eb = try EditBuffer.init(allocator, pool, link_pool, .unicode);
131
+ defer eb.deinit();
132
+
133
+ // Build up text
134
+ const text = "Hello, world! ";
135
+ for (0..1000) |_| {
136
+ try eb.insertText(text);
137
+ }
138
+
139
+ var timer = try std.time.Timer.start();
140
+ for (0..500) |_| {
141
+ try eb.backspace();
142
+ }
143
+ stats.record(timer.read());
144
+
145
+ if (iter == iterations - 1 and show_mem) {
146
+ final_mem = eb.getTextBuffer().getArenaAllocatedBytes();
147
+ }
148
+ }
149
+
150
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
151
+ const s = try allocator.alloc(MemStat, 1);
152
+ s[0] = .{ .name = "TB", .bytes = final_mem };
153
+ break :blk s;
154
+ } else null;
155
+
156
+ try results.append(allocator, BenchResult{
157
+ .name = name,
158
+ .min_ns = stats.min_ns,
159
+ .avg_ns = stats.avg(),
160
+ .max_ns = stats.max_ns,
161
+ .total_ns = stats.total_ns,
162
+ .iterations = iterations,
163
+ .mem_stats = mem_stats,
164
+ });
165
+ }
166
+ }
167
+
168
+ // Multi-line delete range
169
+ {
170
+ const name = "EditBuffer delete 50-line range";
171
+ if (bench_utils.matchesBenchFilter(name, bench_filter)) {
172
+ var stats = BenchStats{};
173
+ var final_mem: usize = 0;
174
+
175
+ for (0..iterations) |iter| {
176
+ var eb = try EditBuffer.init(allocator, pool, link_pool, .unicode);
177
+ defer eb.deinit();
178
+
179
+ // Build up text with many lines
180
+ const text = "Line 1\nLine 2\nLine 3\n";
181
+ for (0..100) |_| {
182
+ try eb.insertText(text);
183
+ }
184
+
185
+ var timer = try std.time.Timer.start();
186
+ // Delete across 50 lines
187
+ try eb.deleteRange(.{ .row = 10, .col = 0 }, .{ .row = 60, .col = 0 });
188
+ stats.record(timer.read());
189
+
190
+ if (iter == iterations - 1 and show_mem) {
191
+ final_mem = eb.getTextBuffer().getArenaAllocatedBytes();
192
+ }
193
+ }
194
+
195
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
196
+ const s = try allocator.alloc(MemStat, 1);
197
+ s[0] = .{ .name = "TB", .bytes = final_mem };
198
+ break :blk s;
199
+ } else null;
200
+
201
+ try results.append(allocator, BenchResult{
202
+ .name = name,
203
+ .min_ns = stats.min_ns,
204
+ .avg_ns = stats.avg(),
205
+ .max_ns = stats.max_ns,
206
+ .total_ns = stats.total_ns,
207
+ .iterations = iterations,
208
+ .mem_stats = mem_stats,
209
+ });
210
+ }
211
+ }
212
+
213
+ return try results.toOwnedSlice(allocator);
214
+ }
215
+
216
+ fn benchMixedOperations(
217
+ allocator: std.mem.Allocator,
218
+ pool: *gp.GraphemePool,
219
+ iterations: usize,
220
+ show_mem: bool,
221
+ bench_filter: ?[]const u8,
222
+ ) ![]BenchResult {
223
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
224
+ errdefer results.deinit(allocator);
225
+ const link_pool = link.initGlobalLinkPool(allocator);
226
+
227
+ // Simulated typing session
228
+ {
229
+ const name = "EditBuffer mixed operations (300 lines)";
230
+ if (bench_utils.matchesBenchFilter(name, bench_filter)) {
231
+ var stats = BenchStats{};
232
+ var final_mem: usize = 0;
233
+
234
+ for (0..iterations) |iter| {
235
+ var eb = try EditBuffer.init(allocator, pool, link_pool, .unicode);
236
+ defer eb.deinit();
237
+
238
+ var timer = try std.time.Timer.start();
239
+
240
+ // Type some text
241
+ for (0..100) |_| {
242
+ try eb.insertText("function test() {\n");
243
+ try eb.insertText(" return 42;\n");
244
+ try eb.insertText("}\n");
245
+ }
246
+
247
+ // Navigate and edit
248
+ try eb.setCursor(50, 0);
249
+ try eb.insertText("// Comment\n");
250
+
251
+ // Delete a range
252
+ try eb.deleteRange(.{ .row = 100, .col = 0 }, .{ .row = 120, .col = 0 });
253
+
254
+ stats.record(timer.read());
255
+
256
+ if (iter == iterations - 1 and show_mem) {
257
+ final_mem = eb.getTextBuffer().getArenaAllocatedBytes();
258
+ }
259
+ }
260
+
261
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
262
+ const s = try allocator.alloc(MemStat, 1);
263
+ s[0] = .{ .name = "TB", .bytes = final_mem };
264
+ break :blk s;
265
+ } else null;
266
+
267
+ try results.append(allocator, BenchResult{
268
+ .name = name,
269
+ .min_ns = stats.min_ns,
270
+ .avg_ns = stats.avg(),
271
+ .max_ns = stats.max_ns,
272
+ .total_ns = stats.total_ns,
273
+ .iterations = iterations,
274
+ .mem_stats = mem_stats,
275
+ });
276
+ }
277
+ }
278
+
279
+ return try results.toOwnedSlice(allocator);
280
+ }
281
+
282
+ fn benchWordBoundaryOperations(
283
+ allocator: std.mem.Allocator,
284
+ pool: *gp.GraphemePool,
285
+ iterations: usize,
286
+ show_mem: bool,
287
+ bench_filter: ?[]const u8,
288
+ ) ![]BenchResult {
289
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
290
+ errdefer results.deinit(allocator);
291
+ const link_pool = link.initGlobalLinkPool(allocator);
292
+
293
+ // Next word boundary navigation
294
+ {
295
+ const name = "EditBuffer getNextWordBoundary 1k times";
296
+ if (bench_utils.matchesBenchFilter(name, bench_filter)) {
297
+ var stats = BenchStats{};
298
+ var final_mem: usize = 0;
299
+
300
+ for (0..iterations) |iter| {
301
+ var eb = try EditBuffer.init(allocator, pool, link_pool, .unicode);
302
+ defer eb.deinit();
303
+
304
+ // Build text with many words
305
+ const text = "The quick brown fox jumps over the lazy dog. ";
306
+ for (0..100) |_| {
307
+ try eb.insertText(text);
308
+ }
309
+
310
+ try eb.setCursor(0, 0);
311
+
312
+ var timer = try std.time.Timer.start();
313
+ // Navigate through 1000 word boundaries
314
+ for (0..1000) |_| {
315
+ const cursor = eb.getNextWordBoundary();
316
+ try eb.setCursor(cursor.row, cursor.col);
317
+ }
318
+ stats.record(timer.read());
319
+
320
+ if (iter == iterations - 1 and show_mem) {
321
+ final_mem = eb.getTextBuffer().getArenaAllocatedBytes();
322
+ }
323
+ }
324
+
325
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
326
+ const s = try allocator.alloc(MemStat, 1);
327
+ s[0] = .{ .name = "TB", .bytes = final_mem };
328
+ break :blk s;
329
+ } else null;
330
+
331
+ try results.append(allocator, BenchResult{
332
+ .name = name,
333
+ .min_ns = stats.min_ns,
334
+ .avg_ns = stats.avg(),
335
+ .max_ns = stats.max_ns,
336
+ .total_ns = stats.total_ns,
337
+ .iterations = iterations,
338
+ .mem_stats = mem_stats,
339
+ });
340
+ }
341
+ }
342
+
343
+ // Previous word boundary navigation
344
+ {
345
+ const name = "EditBuffer getPrevWordBoundary 1k times";
346
+ if (bench_utils.matchesBenchFilter(name, bench_filter)) {
347
+ var stats = BenchStats{};
348
+ var final_mem: usize = 0;
349
+
350
+ for (0..iterations) |iter| {
351
+ var eb = try EditBuffer.init(allocator, pool, link_pool, .unicode);
352
+ defer eb.deinit();
353
+
354
+ // Build text with many words
355
+ const text = "The quick brown fox jumps over the lazy dog. ";
356
+ for (0..100) |_| {
357
+ try eb.insertText(text);
358
+ }
359
+
360
+ // Start at end
361
+ const line_count = eb.getTextBuffer().lineCount();
362
+ const last_line = if (line_count > 0) line_count - 1 else 0;
363
+ try eb.setCursor(last_line, 4500);
364
+
365
+ var timer = try std.time.Timer.start();
366
+ // Navigate backward through 1000 word boundaries
367
+ for (0..1000) |_| {
368
+ const cursor = eb.getPrevWordBoundary();
369
+ try eb.setCursor(cursor.row, cursor.col);
370
+ }
371
+ stats.record(timer.read());
372
+
373
+ if (iter == iterations - 1 and show_mem) {
374
+ final_mem = eb.getTextBuffer().getArenaAllocatedBytes();
375
+ }
376
+ }
377
+
378
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
379
+ const s = try allocator.alloc(MemStat, 1);
380
+ s[0] = .{ .name = "TB", .bytes = final_mem };
381
+ break :blk s;
382
+ } else null;
383
+
384
+ try results.append(allocator, BenchResult{
385
+ .name = name,
386
+ .min_ns = stats.min_ns,
387
+ .avg_ns = stats.avg(),
388
+ .max_ns = stats.max_ns,
389
+ .total_ns = stats.total_ns,
390
+ .iterations = iterations,
391
+ .mem_stats = mem_stats,
392
+ });
393
+ }
394
+ }
395
+
396
+ // Word boundary with multi-line text
397
+ {
398
+ const name = "EditBuffer word boundary multi-line 500 times";
399
+ if (bench_utils.matchesBenchFilter(name, bench_filter)) {
400
+ var stats = BenchStats{};
401
+ var final_mem: usize = 0;
402
+
403
+ for (0..iterations) |iter| {
404
+ var eb = try EditBuffer.init(allocator, pool, link_pool, .unicode);
405
+ defer eb.deinit();
406
+
407
+ // Build multi-line text with words
408
+ const text = "Hello world test\nAnother line here\nThird line content\n";
409
+ for (0..100) |_| {
410
+ try eb.insertText(text);
411
+ }
412
+
413
+ try eb.setCursor(0, 0);
414
+
415
+ var timer = try std.time.Timer.start();
416
+ // Navigate through 500 word boundaries across lines
417
+ for (0..500) |_| {
418
+ const cursor = eb.getNextWordBoundary();
419
+ try eb.setCursor(cursor.row, cursor.col);
420
+ }
421
+ stats.record(timer.read());
422
+
423
+ if (iter == iterations - 1 and show_mem) {
424
+ final_mem = eb.getTextBuffer().getArenaAllocatedBytes();
425
+ }
426
+ }
427
+
428
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
429
+ const s = try allocator.alloc(MemStat, 1);
430
+ s[0] = .{ .name = "TB", .bytes = final_mem };
431
+ break :blk s;
432
+ } else null;
433
+
434
+ try results.append(allocator, BenchResult{
435
+ .name = name,
436
+ .min_ns = stats.min_ns,
437
+ .avg_ns = stats.avg(),
438
+ .max_ns = stats.max_ns,
439
+ .total_ns = stats.total_ns,
440
+ .iterations = iterations,
441
+ .mem_stats = mem_stats,
442
+ });
443
+ }
444
+ }
445
+
446
+ return try results.toOwnedSlice(allocator);
447
+ }
448
+
449
+ pub fn run(
450
+ allocator: std.mem.Allocator,
451
+ show_mem: bool,
452
+ bench_filter: ?[]const u8,
453
+ ) ![]BenchResult {
454
+ // Global pool and unicode data are initialized once in bench.zig
455
+ const pool = gp.initGlobalPool(allocator);
456
+
457
+ var all_results: std.ArrayListUnmanaged(BenchResult) = .{};
458
+ errdefer all_results.deinit(allocator);
459
+
460
+ const iterations: usize = 5;
461
+
462
+ // Run all benchmark categories and filter results
463
+ const insert_results = try benchInsertOperations(allocator, pool, iterations, show_mem, bench_filter);
464
+ try all_results.appendSlice(allocator, insert_results);
465
+
466
+ const delete_results = try benchDeleteOperations(allocator, pool, iterations, show_mem, bench_filter);
467
+ try all_results.appendSlice(allocator, delete_results);
468
+
469
+ const mixed_results = try benchMixedOperations(allocator, pool, iterations, show_mem, bench_filter);
470
+ try all_results.appendSlice(allocator, mixed_results);
471
+
472
+ const word_boundary_results = try benchWordBoundaryOperations(allocator, pool, iterations, show_mem, bench_filter);
473
+ try all_results.appendSlice(allocator, word_boundary_results);
474
+
475
+ return try all_results.toOwnedSlice(allocator);
476
+ }
@@ -0,0 +1,100 @@
1
+ const std = @import("std");
2
+ const raw = @import("../native-span-feed.zig");
3
+
4
+ /// Zero-copy benchmark producer (reserve/commit).
5
+ pub export fn benchProduce(
6
+ stream: ?*raw.Stream,
7
+ total_bytes: u64,
8
+ pattern_ptr: ?*const u8,
9
+ pattern_len: usize,
10
+ commit_every: u32,
11
+ ) callconv(.c) i32 {
12
+ if (stream == null) return raw.Status.err_invalid;
13
+ if (total_bytes == 0) return raw.Status.ok;
14
+
15
+ var pattern_slice: []const u8 = raw.default_pattern;
16
+ if (pattern_ptr != null and pattern_len > 0) {
17
+ pattern_slice = @as([*]const u8, @ptrCast(pattern_ptr.?))[0..pattern_len];
18
+ }
19
+ if (pattern_slice.len == 0) return raw.Status.err_invalid;
20
+
21
+ var remaining: u64 = total_bytes;
22
+ var reserve_info: raw.ReserveInfo = undefined;
23
+
24
+ while (remaining > 0) {
25
+ const remaining_usize = if (remaining > std.math.maxInt(usize))
26
+ std.math.maxInt(usize)
27
+ else
28
+ @as(usize, @intCast(remaining));
29
+
30
+ const reserve_status = raw.streamReserve(stream, 1, &reserve_info);
31
+ if (reserve_status != raw.Status.ok) return reserve_status;
32
+
33
+ const available: usize = @intCast(reserve_info.len);
34
+ const to_write = @min(available, remaining_usize);
35
+
36
+ const dest = @as([*]u8, @ptrFromInt(reserve_info.ptr))[0..to_write];
37
+ var dest_index: usize = 0;
38
+ while (dest_index < to_write) {
39
+ const copy_len = @min(pattern_slice.len, to_write - dest_index);
40
+ @memcpy(dest[dest_index .. dest_index + copy_len], pattern_slice[0..copy_len]);
41
+ dest_index += copy_len;
42
+ }
43
+
44
+ const commit_status = raw.streamCommitReserved(stream, @intCast(to_write));
45
+ if (commit_status != raw.Status.ok) return commit_status;
46
+
47
+ remaining -= @as(u64, to_write);
48
+ }
49
+
50
+ _ = commit_every;
51
+ return raw.Status.ok;
52
+ }
53
+
54
+ /// Copy benchmark producer (streamWrite).
55
+ pub export fn benchProduceWrite(
56
+ stream: ?*raw.Stream,
57
+ total_bytes: u64,
58
+ pattern_ptr: ?*const u8,
59
+ pattern_len: usize,
60
+ commit_every: u32,
61
+ ) callconv(.c) i32 {
62
+ if (stream == null) return raw.Status.err_invalid;
63
+ if (total_bytes == 0) return raw.Status.ok;
64
+
65
+ var pattern_slice: []const u8 = raw.default_pattern;
66
+ if (pattern_ptr != null and pattern_len > 0) {
67
+ pattern_slice = @as([*]const u8, @ptrCast(pattern_ptr.?))[0..pattern_len];
68
+ }
69
+ if (pattern_slice.len == 0) return raw.Status.err_invalid;
70
+
71
+ var remaining: u64 = total_bytes;
72
+ var bytes_since_commit: u64 = 0;
73
+
74
+ while (remaining > 0) {
75
+ const remaining_usize = if (remaining > std.math.maxInt(usize))
76
+ std.math.maxInt(usize)
77
+ else
78
+ @as(usize, @intCast(remaining));
79
+
80
+ const to_write = @min(pattern_slice.len, remaining_usize);
81
+ const status = raw.streamWrite(stream, @ptrCast(pattern_slice.ptr), to_write);
82
+ if (status != raw.Status.ok) return status;
83
+
84
+ bytes_since_commit += @as(u64, to_write);
85
+ remaining -= @as(u64, to_write);
86
+
87
+ if (commit_every != 0 and bytes_since_commit >= commit_every) {
88
+ const commit_status = raw.streamCommit(stream);
89
+ if (commit_status != raw.Status.ok) return commit_status;
90
+ bytes_since_commit = 0;
91
+ }
92
+ }
93
+
94
+ if (commit_every != 0 and bytes_since_commit > 0) {
95
+ const commit_status = raw.streamCommit(stream);
96
+ if (commit_status != raw.Status.ok) return commit_status;
97
+ }
98
+
99
+ return raw.Status.ok;
100
+ }