@fairyhunter13/opentui-core 0.1.89 → 0.1.91

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