@fairyhunter13/opentui-core 0.1.112 → 0.1.114
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.
- package/dev/keypress-debug-renderer.ts +148 -0
- package/dev/keypress-debug.ts +43 -0
- package/dev/print-env-vars.ts +32 -0
- package/dev/test-tmux-graphics-334.sh +68 -0
- package/dev/thai-debug-test.ts +68 -0
- package/docs/development.md +144 -0
- package/package.json +63 -51
- package/scripts/build.ts +400 -0
- package/scripts/publish.ts +60 -0
- package/src/3d/SpriteResourceManager.ts +286 -0
- package/src/3d/SpriteUtils.ts +70 -0
- package/src/3d/TextureUtils.ts +196 -0
- package/src/3d/ThreeRenderable.ts +197 -0
- package/src/3d/WGPURenderer.ts +294 -0
- package/src/3d/animation/ExplodingSpriteEffect.ts +513 -0
- package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +429 -0
- package/src/3d/animation/SpriteAnimator.ts +633 -0
- package/src/3d/animation/SpriteParticleGenerator.ts +435 -0
- package/src/3d/canvas.ts +464 -0
- package/src/3d/index.ts +12 -0
- package/src/3d/physics/PlanckPhysicsAdapter.ts +72 -0
- package/src/3d/physics/RapierPhysicsAdapter.ts +66 -0
- package/src/3d/physics/physics-interface.ts +31 -0
- package/src/3d/shaders/supersampling.wgsl +201 -0
- package/src/3d.ts +3 -0
- package/src/NativeSpanFeed.ts +300 -0
- package/src/Renderable.ts +1704 -0
- package/src/__snapshots__/buffer.test.ts.snap +28 -0
- package/src/animation/Timeline.test.ts +2709 -0
- package/src/animation/Timeline.ts +598 -0
- package/src/ansi.ts +18 -0
- package/src/benchmark/attenuation-benchmark.ts +81 -0
- package/src/benchmark/colormatrix-benchmark.ts +128 -0
- package/src/benchmark/gain-benchmark.ts +80 -0
- package/src/benchmark/latest-all-bench-run.json +707 -0
- package/src/benchmark/latest-async-bench-run.json +336 -0
- package/src/benchmark/latest-default-bench-run.json +657 -0
- package/src/benchmark/latest-large-bench-run.json +707 -0
- package/src/benchmark/latest-quick-bench-run.json +207 -0
- package/src/benchmark/markdown-benchmark.ts +1796 -0
- package/src/benchmark/native-span-feed-async-benchmark.ts +355 -0
- package/src/benchmark/native-span-feed-benchmark.md +56 -0
- package/src/benchmark/native-span-feed-benchmark.ts +596 -0
- package/src/benchmark/native-span-feed-compare.ts +280 -0
- package/src/benchmark/renderer-benchmark.ts +754 -0
- package/src/benchmark/text-table-benchmark.ts +948 -0
- package/src/buffer.test.ts +291 -0
- package/src/buffer.ts +554 -0
- package/src/console.test.ts +612 -0
- package/src/console.ts +1254 -0
- package/src/edit-buffer.test.ts +1769 -0
- package/src/edit-buffer.ts +411 -0
- package/src/editor-view.test.ts +1032 -0
- package/src/editor-view.ts +284 -0
- package/src/examples/ascii-font-selection-demo.ts +245 -0
- package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
- package/src/examples/assets/concrete.png +0 -0
- package/src/examples/assets/crate.png +0 -0
- package/src/examples/assets/crate_emissive.png +0 -0
- package/src/examples/assets/forrest_background.png +0 -0
- package/src/examples/assets/hast-example.json +1018 -0
- package/src/examples/assets/heart.png +0 -0
- package/src/examples/assets/main_char_heavy_attack.png +0 -0
- package/src/examples/assets/main_char_idle.png +0 -0
- package/src/examples/assets/main_char_jump_end.png +0 -0
- package/src/examples/assets/main_char_jump_landing.png +0 -0
- package/src/examples/assets/main_char_jump_start.png +0 -0
- package/src/examples/assets/main_char_run_loop.png +0 -0
- package/src/examples/assets/roughness_map.jpg +0 -0
- package/src/examples/build.ts +115 -0
- package/src/examples/code-demo.ts +924 -0
- package/src/examples/console-demo.ts +358 -0
- package/src/examples/core-plugin-slots-demo.ts +759 -0
- package/src/examples/diff-demo.ts +701 -0
- package/src/examples/draggable-three-demo.ts +259 -0
- package/src/examples/editor-demo.ts +322 -0
- package/src/examples/extmarks-demo.ts +196 -0
- package/src/examples/focus-restore-demo.ts +310 -0
- package/src/examples/fonts.ts +245 -0
- package/src/examples/fractal-shader-demo.ts +268 -0
- package/src/examples/framebuffer-demo.ts +674 -0
- package/src/examples/full-unicode-demo.ts +241 -0
- package/src/examples/golden-star-demo.ts +933 -0
- package/src/examples/grayscale-buffer-demo.ts +249 -0
- package/src/examples/hast-syntax-highlighting-demo.ts +129 -0
- package/src/examples/index.ts +926 -0
- package/src/examples/input-demo.ts +377 -0
- package/src/examples/input-select-layout-demo.ts +425 -0
- package/src/examples/install.sh +143 -0
- package/src/examples/keypress-debug-demo.ts +452 -0
- package/src/examples/lib/HexList.ts +122 -0
- package/src/examples/lib/PaletteGrid.ts +125 -0
- package/src/examples/lib/standalone-keys.ts +25 -0
- package/src/examples/lib/tab-controller.ts +243 -0
- package/src/examples/lights-phong-demo.ts +290 -0
- package/src/examples/link-demo.ts +220 -0
- package/src/examples/live-state-demo.ts +480 -0
- package/src/examples/markdown-demo.ts +725 -0
- package/src/examples/mouse-interaction-demo.ts +428 -0
- package/src/examples/nested-zindex-demo.ts +357 -0
- package/src/examples/opacity-example.ts +235 -0
- package/src/examples/opentui-demo.ts +1057 -0
- package/src/examples/physx-planck-2d-demo.ts +623 -0
- package/src/examples/physx-rapier-2d-demo.ts +655 -0
- package/src/examples/relative-positioning-demo.ts +323 -0
- package/src/examples/scroll-example.ts +214 -0
- package/src/examples/scrollbox-mouse-test.ts +112 -0
- package/src/examples/scrollbox-overlay-hit-test.ts +206 -0
- package/src/examples/select-demo.ts +237 -0
- package/src/examples/shader-cube-demo.ts +1015 -0
- package/src/examples/simple-layout-example.ts +591 -0
- package/src/examples/slider-demo.ts +617 -0
- package/src/examples/split-mode-demo.ts +453 -0
- package/src/examples/sprite-animation-demo.ts +443 -0
- package/src/examples/sprite-particle-generator-demo.ts +486 -0
- package/src/examples/static-sprite-demo.ts +193 -0
- package/src/examples/sticky-scroll-example.ts +308 -0
- package/src/examples/styled-text-demo.ts +282 -0
- package/src/examples/tab-select-demo.ts +219 -0
- package/src/examples/terminal-title.ts +29 -0
- package/src/examples/terminal.ts +305 -0
- package/src/examples/text-node-demo.ts +416 -0
- package/src/examples/text-selection-demo.ts +377 -0
- package/src/examples/text-table-demo.ts +503 -0
- package/src/examples/text-truncation-demo.ts +481 -0
- package/src/examples/text-wrap.ts +757 -0
- package/src/examples/texture-loading-demo.ts +259 -0
- package/src/examples/timeline-example.ts +670 -0
- package/src/examples/transparency-demo.ts +400 -0
- package/src/examples/vnode-composition-demo.ts +404 -0
- package/src/examples/wide-grapheme-overlay-demo.ts +280 -0
- package/src/index.ts +24 -0
- package/src/lib/KeyHandler.integration.test.ts +292 -0
- package/src/lib/KeyHandler.stopPropagation.test.ts +289 -0
- package/src/lib/KeyHandler.test.ts +662 -0
- package/src/lib/KeyHandler.ts +222 -0
- package/src/lib/RGBA.test.ts +984 -0
- package/src/lib/RGBA.ts +204 -0
- package/src/lib/ascii.font.ts +330 -0
- package/src/lib/border.test.ts +83 -0
- package/src/lib/border.ts +170 -0
- package/src/lib/bunfs.test.ts +27 -0
- package/src/lib/bunfs.ts +18 -0
- package/src/lib/clipboard.test.ts +41 -0
- package/src/lib/clipboard.ts +47 -0
- package/src/lib/clock.ts +35 -0
- package/src/lib/data-paths.test.ts +133 -0
- package/src/lib/data-paths.ts +109 -0
- package/src/lib/debounce.ts +106 -0
- package/src/lib/detect-links.test.ts +98 -0
- package/src/lib/detect-links.ts +56 -0
- package/src/lib/env.test.ts +228 -0
- package/src/lib/env.ts +209 -0
- package/src/lib/extmarks-history.ts +51 -0
- package/src/lib/extmarks-multiwidth.test.ts +322 -0
- package/src/lib/extmarks.test.ts +3457 -0
- package/src/lib/extmarks.ts +843 -0
- package/src/lib/fonts/block.json +405 -0
- package/src/lib/fonts/grid.json +265 -0
- package/src/lib/fonts/huge.json +741 -0
- package/src/lib/fonts/pallet.json +314 -0
- package/src/lib/fonts/shade.json +591 -0
- package/src/lib/fonts/slick.json +321 -0
- package/src/lib/fonts/tiny.json +69 -0
- package/src/lib/hast-styled-text.ts +59 -0
- package/src/lib/index.ts +21 -0
- package/src/lib/keymapping.test.ts +317 -0
- package/src/lib/keymapping.ts +115 -0
- package/src/lib/objects-in-viewport.test.ts +787 -0
- package/src/lib/objects-in-viewport.ts +153 -0
- package/src/lib/output.capture.ts +58 -0
- package/src/lib/parse.keypress-kitty.protocol.test.ts +340 -0
- package/src/lib/parse.keypress-kitty.test.ts +663 -0
- package/src/lib/parse.keypress-kitty.ts +439 -0
- package/src/lib/parse.keypress.test.ts +1849 -0
- package/src/lib/parse.keypress.ts +397 -0
- package/src/lib/parse.mouse.test.ts +552 -0
- package/src/lib/parse.mouse.ts +232 -0
- package/src/lib/paste.ts +16 -0
- package/src/lib/queue.ts +65 -0
- package/src/lib/renderable.validations.test.ts +87 -0
- package/src/lib/renderable.validations.ts +83 -0
- package/src/lib/scroll-acceleration.ts +98 -0
- package/src/lib/selection.ts +240 -0
- package/src/lib/singleton.ts +28 -0
- package/src/lib/stdin-parser.test.ts +2290 -0
- package/src/lib/stdin-parser.ts +1810 -0
- package/src/lib/styled-text.ts +178 -0
- package/src/lib/terminal-capability-detection.test.ts +202 -0
- package/src/lib/terminal-capability-detection.ts +79 -0
- package/src/lib/terminal-palette.test.ts +878 -0
- package/src/lib/terminal-palette.ts +383 -0
- package/src/lib/tree-sitter/assets/README.md +118 -0
- package/src/lib/tree-sitter/assets/update.ts +334 -0
- package/src/lib/tree-sitter/assets.d.ts +9 -0
- package/src/lib/tree-sitter/cache.test.ts +273 -0
- package/src/lib/tree-sitter/client.test.ts +1165 -0
- package/src/lib/tree-sitter/client.ts +607 -0
- package/src/lib/tree-sitter/default-parsers.ts +86 -0
- package/src/lib/tree-sitter/download-utils.ts +148 -0
- package/src/lib/tree-sitter/index.ts +28 -0
- package/src/lib/tree-sitter/parser.worker.ts +1042 -0
- package/src/lib/tree-sitter/parsers-config.ts +81 -0
- package/src/lib/tree-sitter/resolve-ft.test.ts +55 -0
- package/src/lib/tree-sitter/resolve-ft.ts +189 -0
- package/src/lib/tree-sitter/types.ts +82 -0
- package/src/lib/tree-sitter-styled-text.test.ts +1253 -0
- package/src/lib/tree-sitter-styled-text.ts +306 -0
- package/src/lib/validate-dir-name.ts +55 -0
- package/src/lib/yoga.options.test.ts +628 -0
- package/src/lib/yoga.options.ts +346 -0
- package/src/plugins/core-slot.ts +579 -0
- package/src/plugins/registry.ts +402 -0
- package/src/plugins/types.ts +46 -0
- package/src/post/effects.ts +930 -0
- package/src/post/filters.ts +489 -0
- package/src/post/matrices.ts +288 -0
- package/src/renderables/ASCIIFont.ts +219 -0
- package/src/renderables/Box.test.ts +205 -0
- package/src/renderables/Box.ts +326 -0
- package/src/renderables/Code.test.ts +2062 -0
- package/src/renderables/Code.ts +357 -0
- package/src/renderables/Diff.regression.test.ts +226 -0
- package/src/renderables/Diff.test.ts +3101 -0
- package/src/renderables/Diff.ts +1211 -0
- package/src/renderables/EditBufferRenderable.test.ts +288 -0
- package/src/renderables/EditBufferRenderable.ts +1166 -0
- package/src/renderables/FrameBuffer.ts +47 -0
- package/src/renderables/Input.test.ts +1228 -0
- package/src/renderables/Input.ts +247 -0
- package/src/renderables/LineNumberRenderable.ts +724 -0
- package/src/renderables/Markdown.ts +1393 -0
- package/src/renderables/ScrollBar.ts +422 -0
- package/src/renderables/ScrollBox.ts +883 -0
- package/src/renderables/Select.test.ts +1033 -0
- package/src/renderables/Select.ts +524 -0
- package/src/renderables/Slider.test.ts +456 -0
- package/src/renderables/Slider.ts +342 -0
- package/src/renderables/TabSelect.test.ts +197 -0
- package/src/renderables/TabSelect.ts +455 -0
- package/src/renderables/Text.selection-buffer.test.ts +123 -0
- package/src/renderables/Text.test.ts +2660 -0
- package/src/renderables/Text.ts +147 -0
- package/src/renderables/TextBufferRenderable.ts +518 -0
- package/src/renderables/TextNode.test.ts +1058 -0
- package/src/renderables/TextNode.ts +325 -0
- package/src/renderables/TextTable.test.ts +1421 -0
- package/src/renderables/TextTable.ts +1344 -0
- package/src/renderables/Textarea.ts +430 -0
- package/src/renderables/TimeToFirstDraw.ts +89 -0
- package/src/renderables/__snapshots__/Code.test.ts.snap +13 -0
- package/src/renderables/__snapshots__/Diff.test.ts.snap +785 -0
- package/src/renderables/__snapshots__/Text.test.ts.snap +421 -0
- package/src/renderables/__snapshots__/TextTable.test.ts.snap +215 -0
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +144 -0
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +816 -0
- package/src/renderables/__tests__/LineNumberRenderable.test.ts +1865 -0
- package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +85 -0
- package/src/renderables/__tests__/Markdown.code-colors.test.ts +242 -0
- package/src/renderables/__tests__/Markdown.test.ts +2518 -0
- package/src/renderables/__tests__/MultiRenderable.selection.test.ts +87 -0
- package/src/renderables/__tests__/Textarea.buffer.test.ts +682 -0
- package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +675 -0
- package/src/renderables/__tests__/Textarea.editing.test.ts +2041 -0
- package/src/renderables/__tests__/Textarea.error-handling.test.ts +35 -0
- package/src/renderables/__tests__/Textarea.events.test.ts +738 -0
- package/src/renderables/__tests__/Textarea.highlights.test.ts +590 -0
- package/src/renderables/__tests__/Textarea.keybinding.test.ts +3149 -0
- package/src/renderables/__tests__/Textarea.paste.test.ts +357 -0
- package/src/renderables/__tests__/Textarea.rendering.test.ts +1866 -0
- package/src/renderables/__tests__/Textarea.scroll.test.ts +733 -0
- package/src/renderables/__tests__/Textarea.selection.test.ts +1590 -0
- package/src/renderables/__tests__/Textarea.stress.test.ts +670 -0
- package/src/renderables/__tests__/Textarea.undo-redo.test.ts +383 -0
- package/src/renderables/__tests__/Textarea.visual-lines.test.ts +310 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +221 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +89 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +457 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +158 -0
- package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +387 -0
- package/src/renderables/__tests__/markdown-parser.test.ts +217 -0
- package/src/renderables/__tests__/renderable-test-utils.ts +60 -0
- package/src/renderables/composition/README.md +8 -0
- package/src/renderables/composition/VRenderable.ts +32 -0
- package/src/renderables/composition/constructs.ts +127 -0
- package/src/renderables/composition/vnode.ts +289 -0
- package/src/renderables/index.ts +23 -0
- package/src/renderables/markdown-parser.ts +66 -0
- package/src/renderer.ts +2681 -0
- package/src/runtime-plugin-support.ts +39 -0
- package/src/runtime-plugin.ts +615 -0
- package/src/syntax-style.test.ts +841 -0
- package/src/syntax-style.ts +257 -0
- package/src/testing/README.md +210 -0
- package/src/testing/capture-spans.test.ts +194 -0
- package/src/testing/integration.test.ts +276 -0
- package/src/testing/manual-clock.ts +117 -0
- package/src/testing/mock-keys.test.ts +1378 -0
- package/src/testing/mock-keys.ts +457 -0
- package/src/testing/mock-mouse.test.ts +218 -0
- package/src/testing/mock-mouse.ts +247 -0
- package/src/testing/mock-tree-sitter-client.ts +73 -0
- package/src/testing/spy.ts +13 -0
- package/src/testing/test-recorder.test.ts +415 -0
- package/src/testing/test-recorder.ts +145 -0
- package/src/testing/test-renderer.ts +132 -0
- package/src/testing.ts +7 -0
- package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +481 -0
- package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +19 -0
- package/src/tests/__snapshots__/scrollbox.test.ts.snap +29 -0
- package/src/tests/absolute-positioning.snapshot.test.ts +638 -0
- package/src/tests/allocator-stats.test.ts +38 -0
- package/src/tests/destroy-during-render.test.ts +200 -0
- package/src/tests/destroy-on-exit.fixture.ts +36 -0
- package/src/tests/destroy-on-exit.test.ts +41 -0
- package/src/tests/hover-cursor.test.ts +98 -0
- package/src/tests/native-span-feed-async.test.ts +173 -0
- package/src/tests/native-span-feed-close.test.ts +120 -0
- package/src/tests/native-span-feed-coverage.test.ts +227 -0
- package/src/tests/native-span-feed-edge-cases.test.ts +352 -0
- package/src/tests/native-span-feed-use-after-free.test.ts +45 -0
- package/src/tests/opacity.test.ts +123 -0
- package/src/tests/renderable.snapshot.test.ts +524 -0
- package/src/tests/renderable.test.ts +1281 -0
- package/src/tests/renderer.clock.test.ts +158 -0
- package/src/tests/renderer.console-startup.test.ts +185 -0
- package/src/tests/renderer.control.test.ts +425 -0
- package/src/tests/renderer.core-slot-binding.test.ts +952 -0
- package/src/tests/renderer.cursor.test.ts +26 -0
- package/src/tests/renderer.destroy-during-render.test.ts +147 -0
- package/src/tests/renderer.focus-restore.test.ts +257 -0
- package/src/tests/renderer.focus.test.ts +294 -0
- package/src/tests/renderer.idle.test.ts +219 -0
- package/src/tests/renderer.input.test.ts +2237 -0
- package/src/tests/renderer.kitty-flags.test.ts +195 -0
- package/src/tests/renderer.mouse.test.ts +1274 -0
- package/src/tests/renderer.palette.test.ts +629 -0
- package/src/tests/renderer.selection.test.ts +49 -0
- package/src/tests/renderer.slot-registry.test.ts +684 -0
- package/src/tests/renderer.useMouse.test.ts +47 -0
- package/src/tests/runtime-plugin-node-modules-cycle.fixture.ts +76 -0
- package/src/tests/runtime-plugin-node-modules-mjs.fixture.ts +43 -0
- package/src/tests/runtime-plugin-node-modules-no-bare-rewrite.fixture.ts +67 -0
- package/src/tests/runtime-plugin-node-modules-package-type-cache.fixture.ts +72 -0
- package/src/tests/runtime-plugin-node-modules-runtime-specifier.fixture.ts +44 -0
- package/src/tests/runtime-plugin-node-modules-scoped-package-bare-rewrite.fixture.ts +85 -0
- package/src/tests/runtime-plugin-path-alias.fixture.ts +43 -0
- package/src/tests/runtime-plugin-resolve-roots.fixture.ts +65 -0
- package/src/tests/runtime-plugin-support.fixture.ts +11 -0
- package/src/tests/runtime-plugin-support.test.ts +19 -0
- package/src/tests/runtime-plugin-windows-file-url.fixture.ts +30 -0
- package/src/tests/runtime-plugin.fixture.ts +40 -0
- package/src/tests/runtime-plugin.test.ts +354 -0
- package/src/tests/scrollbox-culling-bug.test.ts +114 -0
- package/src/tests/scrollbox-hitgrid-resize.test.ts +136 -0
- package/src/tests/scrollbox-hitgrid.test.ts +909 -0
- package/src/tests/scrollbox.test.ts +1530 -0
- package/src/tests/wrap-resize-perf.test.ts +276 -0
- package/src/tests/yoga-setters.test.ts +921 -0
- package/src/text-buffer-view.test.ts +705 -0
- package/src/text-buffer-view.ts +189 -0
- package/src/text-buffer.test.ts +347 -0
- package/src/text-buffer.ts +250 -0
- package/src/types.ts +161 -0
- package/src/utils.ts +88 -0
- package/src/zig/ansi.zig +268 -0
- package/src/zig/bench/README.md +50 -0
- package/src/zig/bench/buffer-draw-text-buffer_bench.zig +887 -0
- package/src/zig/bench/edit-buffer_bench.zig +476 -0
- package/src/zig/bench/native-span-feed_bench.zig +100 -0
- package/src/zig/bench/rope-markers_bench.zig +713 -0
- package/src/zig/bench/rope_bench.zig +514 -0
- package/src/zig/bench/styled-text_bench.zig +470 -0
- package/src/zig/bench/text-buffer-coords_bench.zig +362 -0
- package/src/zig/bench/text-buffer-view_bench.zig +459 -0
- package/src/zig/bench/text-chunk-graphemes_bench.zig +273 -0
- package/src/zig/bench/utf8_bench.zig +799 -0
- package/src/zig/bench-utils.zig +431 -0
- package/src/zig/bench.zig +217 -0
- package/src/zig/buffer-methods.zig +211 -0
- package/src/zig/buffer.zig +2281 -0
- package/src/zig/build.zig +289 -0
- package/src/zig/build.zig.zon +16 -0
- package/src/zig/edit-buffer.zig +825 -0
- package/src/zig/editor-view.zig +802 -0
- package/src/zig/event-bus.zig +13 -0
- package/src/zig/event-emitter.zig +65 -0
- package/src/zig/file-logger.zig +92 -0
- package/src/zig/grapheme.zig +599 -0
- package/src/zig/lib.zig +1854 -0
- package/src/zig/link.zig +333 -0
- package/src/zig/logger.zig +43 -0
- package/src/zig/mem-registry.zig +125 -0
- package/src/zig/native-span-feed-bench-lib.zig +7 -0
- package/src/zig/native-span-feed.zig +708 -0
- package/src/zig/renderer.zig +1393 -0
- package/src/zig/rope.zig +1220 -0
- package/src/zig/syntax-style.zig +161 -0
- package/src/zig/terminal.zig +987 -0
- package/src/zig/test.zig +72 -0
- package/src/zig/tests/README.md +18 -0
- package/src/zig/tests/buffer-methods_test.zig +1109 -0
- package/src/zig/tests/buffer_test.zig +2557 -0
- package/src/zig/tests/edit-buffer-history_test.zig +271 -0
- package/src/zig/tests/edit-buffer_test.zig +1689 -0
- package/src/zig/tests/editor-view_test.zig +3299 -0
- package/src/zig/tests/event-emitter_test.zig +249 -0
- package/src/zig/tests/grapheme_test.zig +1304 -0
- package/src/zig/tests/link_test.zig +190 -0
- package/src/zig/tests/mem-registry_test.zig +473 -0
- package/src/zig/tests/memory_leak_regression_test.zig +159 -0
- package/src/zig/tests/native-span-feed_test.zig +1264 -0
- package/src/zig/tests/renderer_test.zig +1017 -0
- package/src/zig/tests/rope-nested_test.zig +712 -0
- package/src/zig/tests/rope_fuzz_test.zig +238 -0
- package/src/zig/tests/rope_test.zig +2362 -0
- package/src/zig/tests/segment-merge.test.zig +148 -0
- package/src/zig/tests/syntax-style_test.zig +557 -0
- package/src/zig/tests/terminal_test.zig +754 -0
- package/src/zig/tests/text-buffer-drawing_test.zig +3237 -0
- package/src/zig/tests/text-buffer-highlights_test.zig +666 -0
- package/src/zig/tests/text-buffer-iterators_test.zig +776 -0
- package/src/zig/tests/text-buffer-segment_test.zig +320 -0
- package/src/zig/tests/text-buffer-selection_test.zig +1035 -0
- package/src/zig/tests/text-buffer-selection_viewport_test.zig +358 -0
- package/src/zig/tests/text-buffer-view_test.zig +3649 -0
- package/src/zig/tests/text-buffer_test.zig +2191 -0
- package/src/zig/tests/unicode-width-map.zon +3909 -0
- package/src/zig/tests/utf8_no_zwj_test.zig +260 -0
- package/src/zig/tests/utf8_test.zig +4057 -0
- package/src/zig/tests/utf8_wcwidth_cursor_test.zig +267 -0
- package/src/zig/tests/utf8_wcwidth_test.zig +357 -0
- package/src/zig/tests/word-wrap-editing_test.zig +498 -0
- package/src/zig/tests/wrap-cache-perf_test.zig +113 -0
- package/src/zig/text-buffer-iterators.zig +499 -0
- package/src/zig/text-buffer-segment.zig +404 -0
- package/src/zig/text-buffer-view.zig +1371 -0
- package/src/zig/text-buffer.zig +1180 -0
- package/src/zig/utf8.zig +1948 -0
- package/src/zig/utils.zig +9 -0
- package/src/zig-structs.ts +261 -0
- package/src/zig.ts +3884 -0
- package/tsconfig.build.json +24 -0
- package/tsconfig.json +27 -0
- package/3d/SpriteResourceManager.d.ts +0 -74
- package/3d/SpriteUtils.d.ts +0 -13
- package/3d/TextureUtils.d.ts +0 -24
- package/3d/ThreeRenderable.d.ts +0 -40
- package/3d/WGPURenderer.d.ts +0 -61
- package/3d/animation/ExplodingSpriteEffect.d.ts +0 -71
- package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +0 -76
- package/3d/animation/SpriteAnimator.d.ts +0 -124
- package/3d/animation/SpriteParticleGenerator.d.ts +0 -62
- package/3d/canvas.d.ts +0 -44
- package/3d/index.d.ts +0 -12
- package/3d/physics/PlanckPhysicsAdapter.d.ts +0 -19
- package/3d/physics/RapierPhysicsAdapter.d.ts +0 -19
- package/3d/physics/physics-interface.d.ts +0 -27
- package/3d.d.ts +0 -2
- package/3d.js +0 -34041
- package/3d.js.map +0 -155
- package/LICENSE +0 -21
- package/NativeSpanFeed.d.ts +0 -41
- package/Renderable.d.ts +0 -334
- package/animation/Timeline.d.ts +0 -126
- package/ansi.d.ts +0 -13
- package/buffer.d.ts +0 -111
- package/console.d.ts +0 -144
- package/edit-buffer.d.ts +0 -98
- package/editor-view.d.ts +0 -73
- package/index-8fks7yv1.js +0 -411
- package/index-8fks7yv1.js.map +0 -10
- package/index-egy5e2rs.js +0 -12267
- package/index-egy5e2rs.js.map +0 -42
- package/index-tse8gzh0.js +0 -20614
- package/index-tse8gzh0.js.map +0 -67
- package/index.d.ts +0 -23
- package/index.js +0 -478
- package/index.js.map +0 -9
- package/lib/KeyHandler.d.ts +0 -61
- package/lib/RGBA.d.ts +0 -25
- package/lib/ascii.font.d.ts +0 -508
- package/lib/border.d.ts +0 -51
- package/lib/bunfs.d.ts +0 -7
- package/lib/clipboard.d.ts +0 -17
- package/lib/clock.d.ts +0 -15
- package/lib/data-paths.d.ts +0 -26
- package/lib/debounce.d.ts +0 -42
- package/lib/detect-links.d.ts +0 -6
- package/lib/env.d.ts +0 -42
- package/lib/extmarks-history.d.ts +0 -17
- package/lib/extmarks.d.ts +0 -89
- package/lib/hast-styled-text.d.ts +0 -17
- package/lib/index.d.ts +0 -21
- package/lib/keymapping.d.ts +0 -25
- package/lib/objects-in-viewport.d.ts +0 -24
- package/lib/output.capture.d.ts +0 -24
- package/lib/parse.keypress-kitty.d.ts +0 -2
- package/lib/parse.keypress.d.ts +0 -26
- package/lib/parse.mouse.d.ts +0 -30
- package/lib/paste.d.ts +0 -7
- package/lib/queue.d.ts +0 -15
- package/lib/renderable.validations.d.ts +0 -12
- package/lib/scroll-acceleration.d.ts +0 -43
- package/lib/selection.d.ts +0 -63
- package/lib/singleton.d.ts +0 -7
- package/lib/stdin-parser.d.ts +0 -87
- package/lib/styled-text.d.ts +0 -63
- package/lib/terminal-capability-detection.d.ts +0 -30
- package/lib/terminal-palette.d.ts +0 -50
- package/lib/tree-sitter/assets/update.d.ts +0 -11
- package/lib/tree-sitter/client.d.ts +0 -47
- package/lib/tree-sitter/default-parsers.d.ts +0 -2
- package/lib/tree-sitter/download-utils.d.ts +0 -21
- package/lib/tree-sitter/index.d.ts +0 -8
- package/lib/tree-sitter/parser.worker.d.ts +0 -1
- package/lib/tree-sitter/parsers-config.d.ts +0 -53
- package/lib/tree-sitter/resolve-ft.d.ts +0 -5
- package/lib/tree-sitter/types.d.ts +0 -82
- package/lib/tree-sitter-styled-text.d.ts +0 -14
- package/lib/validate-dir-name.d.ts +0 -1
- package/lib/yoga.options.d.ts +0 -32
- package/parser.worker.js +0 -899
- package/parser.worker.js.map +0 -12
- package/plugins/core-slot.d.ts +0 -72
- package/plugins/registry.d.ts +0 -42
- package/plugins/types.d.ts +0 -34
- package/post/effects.d.ts +0 -147
- package/post/filters.d.ts +0 -65
- package/post/matrices.d.ts +0 -20
- package/renderables/ASCIIFont.d.ts +0 -52
- package/renderables/Box.d.ts +0 -81
- package/renderables/Code.d.ts +0 -78
- package/renderables/Diff.d.ts +0 -142
- package/renderables/EditBufferRenderable.d.ts +0 -237
- package/renderables/FrameBuffer.d.ts +0 -16
- package/renderables/Input.d.ts +0 -67
- package/renderables/LineNumberRenderable.d.ts +0 -78
- package/renderables/Markdown.d.ts +0 -185
- package/renderables/ScrollBar.d.ts +0 -77
- package/renderables/ScrollBox.d.ts +0 -124
- package/renderables/Select.d.ts +0 -115
- package/renderables/Slider.d.ts +0 -47
- package/renderables/TabSelect.d.ts +0 -96
- package/renderables/Text.d.ts +0 -36
- package/renderables/TextBufferRenderable.d.ts +0 -105
- package/renderables/TextNode.d.ts +0 -91
- package/renderables/TextTable.d.ts +0 -140
- package/renderables/Textarea.d.ts +0 -63
- package/renderables/TimeToFirstDraw.d.ts +0 -24
- package/renderables/__tests__/renderable-test-utils.d.ts +0 -12
- package/renderables/composition/VRenderable.d.ts +0 -16
- package/renderables/composition/constructs.d.ts +0 -35
- package/renderables/composition/vnode.d.ts +0 -46
- package/renderables/index.d.ts +0 -23
- package/renderables/markdown-parser.d.ts +0 -10
- package/renderer.d.ts +0 -419
- package/runtime-plugin-support.d.ts +0 -3
- package/runtime-plugin-support.js +0 -29
- package/runtime-plugin-support.js.map +0 -10
- package/runtime-plugin.d.ts +0 -16
- package/runtime-plugin.js +0 -16
- package/runtime-plugin.js.map +0 -9
- package/syntax-style.d.ts +0 -54
- package/testing/manual-clock.d.ts +0 -17
- package/testing/mock-keys.d.ts +0 -81
- package/testing/mock-mouse.d.ts +0 -38
- package/testing/mock-tree-sitter-client.d.ts +0 -23
- package/testing/spy.d.ts +0 -7
- package/testing/test-recorder.d.ts +0 -61
- package/testing/test-renderer.d.ts +0 -23
- package/testing.d.ts +0 -6
- package/testing.js +0 -697
- package/testing.js.map +0 -15
- package/text-buffer-view.d.ts +0 -42
- package/text-buffer.d.ts +0 -67
- package/types.d.ts +0 -139
- package/utils.d.ts +0 -14
- package/zig-structs.d.ts +0 -155
- package/zig.d.ts +0 -353
- /package/{assets → src/lib/tree-sitter/assets}/javascript/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/javascript/tree-sitter-javascript.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/injections.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/tree-sitter-markdown.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/typescript/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/typescript/tree-sitter-typescript.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/zig/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/zig/tree-sitter-zig.wasm +0 -0
|
@@ -0,0 +1,713 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
const bench_utils = @import("../bench-utils.zig");
|
|
3
|
+
const rope_mod = @import("../rope.zig");
|
|
4
|
+
|
|
5
|
+
const BenchResult = bench_utils.BenchResult;
|
|
6
|
+
const BenchStats = bench_utils.BenchStats;
|
|
7
|
+
const MemStats = bench_utils.MemStats;
|
|
8
|
+
|
|
9
|
+
pub const benchName = "Rope Marker Tracking";
|
|
10
|
+
|
|
11
|
+
// Test union type with markers (like Segment with .brk)
|
|
12
|
+
const Token = union(enum) {
|
|
13
|
+
text: u32, // Text segments (width)
|
|
14
|
+
marker: void, // Line markers
|
|
15
|
+
|
|
16
|
+
pub const MarkerTypes = &[_]std.meta.Tag(Token){.marker};
|
|
17
|
+
|
|
18
|
+
pub const Metrics = struct {
|
|
19
|
+
width: u32 = 0,
|
|
20
|
+
|
|
21
|
+
pub fn add(self: *Metrics, other: Metrics) void {
|
|
22
|
+
self.width += other.width;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
pub fn weight(self: *const Metrics) u32 {
|
|
26
|
+
return self.width;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
pub fn measure(self: *const Token) Metrics {
|
|
31
|
+
return switch (self.*) {
|
|
32
|
+
.text => |w| .{ .width = w },
|
|
33
|
+
.marker => .{ .width = 0 },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
pub fn empty() Token {
|
|
38
|
+
return .{ .text = 0 };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
pub fn is_empty(self: *const Token) bool {
|
|
42
|
+
return switch (self.*) {
|
|
43
|
+
.text => |w| w == 0,
|
|
44
|
+
else => false,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const RopeType = rope_mod.Rope(Token);
|
|
50
|
+
|
|
51
|
+
/// Create a rope with specific marker density
|
|
52
|
+
/// marker_every: insert a marker every N text tokens
|
|
53
|
+
fn createRope(allocator: std.mem.Allocator, text_count: u32, marker_every: u32) !RopeType {
|
|
54
|
+
var tokens: std.ArrayListUnmanaged(Token) = .{};
|
|
55
|
+
defer tokens.deinit(allocator);
|
|
56
|
+
|
|
57
|
+
for (0..text_count) |i| {
|
|
58
|
+
try tokens.append(allocator, .{ .text = 10 }); // Each text segment has width 10
|
|
59
|
+
if ((i + 1) % marker_every == 0) {
|
|
60
|
+
try tokens.append(allocator, .{ .marker = {} });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return try RopeType.from_slice(allocator, tokens.items);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
fn benchRebuildMarkerIndex(
|
|
68
|
+
allocator: std.mem.Allocator,
|
|
69
|
+
iterations: usize,
|
|
70
|
+
bench_filter: ?[]const u8,
|
|
71
|
+
) ![]BenchResult {
|
|
72
|
+
var results: std.ArrayListUnmanaged(BenchResult) = .{};
|
|
73
|
+
errdefer results.deinit(allocator);
|
|
74
|
+
|
|
75
|
+
// Small rope, high marker density (every 10 tokens)
|
|
76
|
+
{
|
|
77
|
+
const name = "Create rope with markers: 1k tokens, marker every 10 (~100 markers)";
|
|
78
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
79
|
+
var stats = BenchStats{};
|
|
80
|
+
for (0..iterations) |_| {
|
|
81
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
82
|
+
defer arena.deinit();
|
|
83
|
+
|
|
84
|
+
var timer = try std.time.Timer.start();
|
|
85
|
+
const rope = try createRope(arena.allocator(), 1000, 10);
|
|
86
|
+
_ = rope; // Markers are automatically indexed during rope creation
|
|
87
|
+
stats.record(timer.read());
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
try results.append(allocator, BenchResult{
|
|
91
|
+
.name = name,
|
|
92
|
+
.min_ns = stats.min_ns,
|
|
93
|
+
.avg_ns = stats.avg(),
|
|
94
|
+
.max_ns = stats.max_ns,
|
|
95
|
+
.total_ns = stats.total_ns,
|
|
96
|
+
.iterations = iterations,
|
|
97
|
+
.mem_stats = null,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Small rope, low marker density (every 100 tokens)
|
|
103
|
+
{
|
|
104
|
+
const name = "Rebuild index: 1k tokens, marker every 100 (~10 markers)";
|
|
105
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
106
|
+
var stats = BenchStats{};
|
|
107
|
+
for (0..iterations) |_| {
|
|
108
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
109
|
+
defer arena.deinit();
|
|
110
|
+
|
|
111
|
+
var timer = try std.time.Timer.start();
|
|
112
|
+
const rope = try createRope(arena.allocator(), 1000, 100);
|
|
113
|
+
_ = rope; // Markers are automatically indexed during rope creation
|
|
114
|
+
stats.record(timer.read());
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
try results.append(allocator, BenchResult{
|
|
118
|
+
.name = name,
|
|
119
|
+
.min_ns = stats.min_ns,
|
|
120
|
+
.avg_ns = stats.avg(),
|
|
121
|
+
.max_ns = stats.max_ns,
|
|
122
|
+
.total_ns = stats.total_ns,
|
|
123
|
+
.iterations = iterations,
|
|
124
|
+
.mem_stats = null,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Medium rope, high marker density
|
|
130
|
+
{
|
|
131
|
+
const name = "Rebuild index: 10k tokens, marker every 10 (~1k markers)";
|
|
132
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
133
|
+
var stats = BenchStats{};
|
|
134
|
+
for (0..iterations) |_| {
|
|
135
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
136
|
+
defer arena.deinit();
|
|
137
|
+
|
|
138
|
+
var timer = try std.time.Timer.start();
|
|
139
|
+
const rope = try createRope(arena.allocator(), 10000, 10);
|
|
140
|
+
_ = rope; // Markers are automatically indexed during rope creation
|
|
141
|
+
stats.record(timer.read());
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
try results.append(allocator, BenchResult{
|
|
145
|
+
.name = name,
|
|
146
|
+
.min_ns = stats.min_ns,
|
|
147
|
+
.avg_ns = stats.avg(),
|
|
148
|
+
.max_ns = stats.max_ns,
|
|
149
|
+
.total_ns = stats.total_ns,
|
|
150
|
+
.iterations = iterations,
|
|
151
|
+
.mem_stats = null,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Medium rope, low marker density
|
|
157
|
+
{
|
|
158
|
+
const name = "Rebuild index: 10k tokens, marker every 100 (~100 markers)";
|
|
159
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
160
|
+
var stats = BenchStats{};
|
|
161
|
+
for (0..iterations) |_| {
|
|
162
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
163
|
+
defer arena.deinit();
|
|
164
|
+
|
|
165
|
+
var timer = try std.time.Timer.start();
|
|
166
|
+
const rope = try createRope(arena.allocator(), 10000, 100);
|
|
167
|
+
_ = rope; // Markers are automatically indexed during rope creation
|
|
168
|
+
stats.record(timer.read());
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
try results.append(allocator, BenchResult{
|
|
172
|
+
.name = name,
|
|
173
|
+
.min_ns = stats.min_ns,
|
|
174
|
+
.avg_ns = stats.avg(),
|
|
175
|
+
.max_ns = stats.max_ns,
|
|
176
|
+
.total_ns = stats.total_ns,
|
|
177
|
+
.iterations = iterations,
|
|
178
|
+
.mem_stats = null,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Large rope, text-editor-like density (marker every 50 = ~50 chars/line)
|
|
184
|
+
{
|
|
185
|
+
const name = "Rebuild index: 50k tokens, marker every 50 (~1k markers, text-editor-like)";
|
|
186
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
187
|
+
var stats = BenchStats{};
|
|
188
|
+
for (0..iterations) |_| {
|
|
189
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
190
|
+
defer arena.deinit();
|
|
191
|
+
|
|
192
|
+
var timer = try std.time.Timer.start();
|
|
193
|
+
const rope = try createRope(arena.allocator(), 50000, 50);
|
|
194
|
+
_ = rope; // Markers are automatically indexed during rope creation
|
|
195
|
+
stats.record(timer.read());
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
try results.append(allocator, BenchResult{
|
|
199
|
+
.name = name,
|
|
200
|
+
.min_ns = stats.min_ns,
|
|
201
|
+
.avg_ns = stats.avg(),
|
|
202
|
+
.max_ns = stats.max_ns,
|
|
203
|
+
.total_ns = stats.total_ns,
|
|
204
|
+
.iterations = iterations,
|
|
205
|
+
.mem_stats = null,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Very large rope, sparse markers
|
|
211
|
+
{
|
|
212
|
+
const name = "Rebuild index: 100k tokens, marker every 200 (~500 markers)";
|
|
213
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
214
|
+
var stats = BenchStats{};
|
|
215
|
+
for (0..iterations) |_| {
|
|
216
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
217
|
+
defer arena.deinit();
|
|
218
|
+
|
|
219
|
+
var timer = try std.time.Timer.start();
|
|
220
|
+
const rope = try createRope(arena.allocator(), 100000, 200);
|
|
221
|
+
_ = rope; // Markers are automatically indexed during rope creation
|
|
222
|
+
stats.record(timer.read());
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
try results.append(allocator, BenchResult{
|
|
226
|
+
.name = name,
|
|
227
|
+
.min_ns = stats.min_ns,
|
|
228
|
+
.avg_ns = stats.avg(),
|
|
229
|
+
.max_ns = stats.max_ns,
|
|
230
|
+
.total_ns = stats.total_ns,
|
|
231
|
+
.iterations = iterations,
|
|
232
|
+
.mem_stats = null,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return try results.toOwnedSlice(allocator);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
fn benchMarkerLookup(
|
|
241
|
+
allocator: std.mem.Allocator,
|
|
242
|
+
iterations: usize,
|
|
243
|
+
bench_filter: ?[]const u8,
|
|
244
|
+
) ![]BenchResult {
|
|
245
|
+
var results: std.ArrayListUnmanaged(BenchResult) = .{};
|
|
246
|
+
errdefer results.deinit(allocator);
|
|
247
|
+
|
|
248
|
+
// O(1) lookup in small rope
|
|
249
|
+
{
|
|
250
|
+
const name = "O(1) lookup: 100 random marker accesses, ~100 markers";
|
|
251
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
252
|
+
var stats = BenchStats{};
|
|
253
|
+
for (0..iterations) |_| {
|
|
254
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
255
|
+
defer arena.deinit();
|
|
256
|
+
|
|
257
|
+
var rope = try createRope(arena.allocator(), 1000, 10);
|
|
258
|
+
// Markers are automatically indexed in the tree structure
|
|
259
|
+
|
|
260
|
+
var timer = try std.time.Timer.start();
|
|
261
|
+
for (0..100) |i| {
|
|
262
|
+
_ = rope.getMarker(.marker, @intCast(i % rope.markerCount(.marker)));
|
|
263
|
+
}
|
|
264
|
+
stats.record(timer.read());
|
|
265
|
+
}
|
|
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 = null,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// O(1) lookup in medium rope
|
|
280
|
+
{
|
|
281
|
+
const name = "O(1) lookup: 1k random marker accesses, ~200 markers";
|
|
282
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
283
|
+
var stats = BenchStats{};
|
|
284
|
+
for (0..iterations) |_| {
|
|
285
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
286
|
+
defer arena.deinit();
|
|
287
|
+
|
|
288
|
+
var rope = try createRope(arena.allocator(), 10000, 50);
|
|
289
|
+
// Markers are automatically indexed in the tree structure
|
|
290
|
+
|
|
291
|
+
var timer = try std.time.Timer.start();
|
|
292
|
+
for (0..1000) |i| {
|
|
293
|
+
_ = rope.getMarker(.marker, @intCast(i % rope.markerCount(.marker)));
|
|
294
|
+
}
|
|
295
|
+
stats.record(timer.read());
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
try results.append(allocator, BenchResult{
|
|
299
|
+
.name = name,
|
|
300
|
+
.min_ns = stats.min_ns,
|
|
301
|
+
.avg_ns = stats.avg(),
|
|
302
|
+
.max_ns = stats.max_ns,
|
|
303
|
+
.total_ns = stats.total_ns,
|
|
304
|
+
.iterations = iterations,
|
|
305
|
+
.mem_stats = null,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// O(1) lookup in large rope (text-editor scenario)
|
|
311
|
+
{
|
|
312
|
+
const name = "O(1) lookup: 10k random line jumps, ~1k lines (text-editor)";
|
|
313
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
314
|
+
var stats = BenchStats{};
|
|
315
|
+
for (0..iterations) |_| {
|
|
316
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
317
|
+
defer arena.deinit();
|
|
318
|
+
|
|
319
|
+
var rope = try createRope(arena.allocator(), 50000, 50);
|
|
320
|
+
// Markers are automatically indexed in the tree structure
|
|
321
|
+
const marker_count = rope.markerCount(.marker);
|
|
322
|
+
|
|
323
|
+
var prng = std.Random.DefaultPrng.init(42);
|
|
324
|
+
const random = prng.random();
|
|
325
|
+
|
|
326
|
+
var timer = try std.time.Timer.start();
|
|
327
|
+
for (0..10000) |_| {
|
|
328
|
+
const line = random.intRangeAtMost(u32, 0, marker_count - 1);
|
|
329
|
+
_ = rope.getMarker(.marker, line);
|
|
330
|
+
}
|
|
331
|
+
stats.record(timer.read());
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
try results.append(allocator, BenchResult{
|
|
335
|
+
.name = name,
|
|
336
|
+
.min_ns = stats.min_ns,
|
|
337
|
+
.avg_ns = stats.avg(),
|
|
338
|
+
.max_ns = stats.max_ns,
|
|
339
|
+
.total_ns = stats.total_ns,
|
|
340
|
+
.iterations = iterations,
|
|
341
|
+
.mem_stats = null,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Sequential marker access (best case)
|
|
347
|
+
{
|
|
348
|
+
const name = "O(1) lookup: Sequential access to all ~200 markers";
|
|
349
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
350
|
+
var stats = BenchStats{};
|
|
351
|
+
for (0..iterations) |_| {
|
|
352
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
353
|
+
defer arena.deinit();
|
|
354
|
+
|
|
355
|
+
var rope = try createRope(arena.allocator(), 10000, 50);
|
|
356
|
+
// Markers are automatically indexed in the tree structure
|
|
357
|
+
const marker_count = rope.markerCount(.marker);
|
|
358
|
+
|
|
359
|
+
var timer = try std.time.Timer.start();
|
|
360
|
+
for (0..marker_count) |i| {
|
|
361
|
+
_ = rope.getMarker(.marker, @intCast(i));
|
|
362
|
+
}
|
|
363
|
+
stats.record(timer.read());
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
try results.append(allocator, BenchResult{
|
|
367
|
+
.name = name,
|
|
368
|
+
.min_ns = stats.min_ns,
|
|
369
|
+
.avg_ns = stats.avg(),
|
|
370
|
+
.max_ns = stats.max_ns,
|
|
371
|
+
.total_ns = stats.total_ns,
|
|
372
|
+
.iterations = iterations,
|
|
373
|
+
.mem_stats = null,
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
return try results.toOwnedSlice(allocator);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
fn benchMarkerCount(
|
|
382
|
+
allocator: std.mem.Allocator,
|
|
383
|
+
iterations: usize,
|
|
384
|
+
bench_filter: ?[]const u8,
|
|
385
|
+
) ![]BenchResult {
|
|
386
|
+
var results: std.ArrayListUnmanaged(BenchResult) = .{};
|
|
387
|
+
errdefer results.deinit(allocator);
|
|
388
|
+
|
|
389
|
+
// Count markers - should be O(1) hash lookup
|
|
390
|
+
{
|
|
391
|
+
const name = "markerCount: 100k calls (should be ~O(1))";
|
|
392
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
393
|
+
var stats = BenchStats{};
|
|
394
|
+
for (0..iterations) |_| {
|
|
395
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
396
|
+
defer arena.deinit();
|
|
397
|
+
|
|
398
|
+
var rope = try createRope(arena.allocator(), 10000, 50);
|
|
399
|
+
// Markers are automatically indexed in the tree structure
|
|
400
|
+
|
|
401
|
+
var timer = try std.time.Timer.start();
|
|
402
|
+
for (0..100000) |_| {
|
|
403
|
+
_ = rope.markerCount(.marker);
|
|
404
|
+
}
|
|
405
|
+
stats.record(timer.read());
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
try results.append(allocator, BenchResult{
|
|
409
|
+
.name = name,
|
|
410
|
+
.min_ns = stats.min_ns,
|
|
411
|
+
.avg_ns = stats.avg(),
|
|
412
|
+
.max_ns = stats.max_ns,
|
|
413
|
+
.total_ns = stats.total_ns,
|
|
414
|
+
.iterations = iterations,
|
|
415
|
+
.mem_stats = null,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return try results.toOwnedSlice(allocator);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
fn benchDepthVsPerformance(
|
|
424
|
+
allocator: std.mem.Allocator,
|
|
425
|
+
iterations: usize,
|
|
426
|
+
bench_filter: ?[]const u8,
|
|
427
|
+
) ![]BenchResult {
|
|
428
|
+
var results: std.ArrayListUnmanaged(BenchResult) = .{};
|
|
429
|
+
errdefer results.deinit(allocator);
|
|
430
|
+
|
|
431
|
+
// Shallow tree (from_slice creates balanced tree)
|
|
432
|
+
{
|
|
433
|
+
const name = "Create BALANCED tree with markers: 10k tokens, ~200 markers";
|
|
434
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
435
|
+
var stats = BenchStats{};
|
|
436
|
+
for (0..iterations) |_| {
|
|
437
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
438
|
+
defer arena.deinit();
|
|
439
|
+
|
|
440
|
+
var timer = try std.time.Timer.start();
|
|
441
|
+
const rope = try createRope(arena.allocator(), 10000, 50);
|
|
442
|
+
_ = rope; // Markers are automatically indexed during rope creation
|
|
443
|
+
stats.record(timer.read());
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
try results.append(allocator, BenchResult{
|
|
447
|
+
.name = name,
|
|
448
|
+
.min_ns = stats.min_ns,
|
|
449
|
+
.avg_ns = stats.avg(),
|
|
450
|
+
.max_ns = stats.max_ns,
|
|
451
|
+
.total_ns = stats.total_ns,
|
|
452
|
+
.iterations = iterations,
|
|
453
|
+
.mem_stats = null,
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Deep tree (built by sequential appends)
|
|
459
|
+
{
|
|
460
|
+
const name = "Rebuild on UNBALANCED tree: 10k tokens, ~200 markers";
|
|
461
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
462
|
+
var stats = BenchStats{};
|
|
463
|
+
for (0..iterations) |_| {
|
|
464
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
465
|
+
defer arena.deinit();
|
|
466
|
+
|
|
467
|
+
// Build unbalanced tree through sequential operations
|
|
468
|
+
var rope = try RopeType.init(arena.allocator());
|
|
469
|
+
for (0..10000) |i| {
|
|
470
|
+
try rope.append(.{ .text = 10 });
|
|
471
|
+
if ((i + 1) % 50 == 0) {
|
|
472
|
+
try rope.append(.{ .marker = {} });
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
var timer = try std.time.Timer.start();
|
|
477
|
+
// Markers are automatically indexed in the tree structure
|
|
478
|
+
stats.record(timer.read());
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
try results.append(allocator, BenchResult{
|
|
482
|
+
.name = name,
|
|
483
|
+
.min_ns = stats.min_ns,
|
|
484
|
+
.avg_ns = stats.avg(),
|
|
485
|
+
.max_ns = stats.max_ns,
|
|
486
|
+
.total_ns = stats.total_ns,
|
|
487
|
+
.iterations = iterations,
|
|
488
|
+
.mem_stats = null,
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
return try results.toOwnedSlice(allocator);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
fn benchEditThenRebuild(
|
|
497
|
+
allocator: std.mem.Allocator,
|
|
498
|
+
iterations: usize,
|
|
499
|
+
bench_filter: ?[]const u8,
|
|
500
|
+
) ![]BenchResult {
|
|
501
|
+
var results: std.ArrayListUnmanaged(BenchResult) = .{};
|
|
502
|
+
errdefer results.deinit(allocator);
|
|
503
|
+
|
|
504
|
+
// Typical edit workflow: build, edit, rebuild
|
|
505
|
+
{
|
|
506
|
+
const name = "Edit workflow: 3 inserts + rebuild (~200 markers)";
|
|
507
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
508
|
+
var stats = BenchStats{};
|
|
509
|
+
for (0..iterations) |_| {
|
|
510
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
511
|
+
defer arena.deinit();
|
|
512
|
+
|
|
513
|
+
var rope = try createRope(arena.allocator(), 10000, 50);
|
|
514
|
+
// Markers are automatically indexed in the tree structure
|
|
515
|
+
|
|
516
|
+
var timer = try std.time.Timer.start();
|
|
517
|
+
// Simulate typing at line 50
|
|
518
|
+
const line50_marker = rope.getMarker(.marker, 50).?;
|
|
519
|
+
const insert_pos = line50_marker.leaf_index + 1;
|
|
520
|
+
|
|
521
|
+
// Insert some text
|
|
522
|
+
try rope.insert(insert_pos, .{ .text = 10 });
|
|
523
|
+
try rope.insert(insert_pos + 1, .{ .text = 10 });
|
|
524
|
+
try rope.insert(insert_pos + 2, .{ .text = 10 });
|
|
525
|
+
|
|
526
|
+
// Rebuild index after edit
|
|
527
|
+
// Markers are automatically indexed in the tree structure
|
|
528
|
+
stats.record(timer.read());
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
try results.append(allocator, BenchResult{
|
|
532
|
+
.name = name,
|
|
533
|
+
.min_ns = stats.min_ns,
|
|
534
|
+
.avg_ns = stats.avg(),
|
|
535
|
+
.max_ns = stats.max_ns,
|
|
536
|
+
.total_ns = stats.total_ns,
|
|
537
|
+
.iterations = iterations,
|
|
538
|
+
.mem_stats = null,
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// Insert new line (adds marker)
|
|
544
|
+
{
|
|
545
|
+
const name = "Insert newline: insert marker + rebuild (~200 markers)";
|
|
546
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
547
|
+
var stats = BenchStats{};
|
|
548
|
+
for (0..iterations) |_| {
|
|
549
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
550
|
+
defer arena.deinit();
|
|
551
|
+
|
|
552
|
+
var rope = try createRope(arena.allocator(), 10000, 50);
|
|
553
|
+
// Markers are automatically indexed in the tree structure
|
|
554
|
+
|
|
555
|
+
var timer = try std.time.Timer.start();
|
|
556
|
+
// Insert new line (marker) at position 100
|
|
557
|
+
try rope.insert(100, .{ .marker = {} });
|
|
558
|
+
// Markers are automatically indexed in the tree structure
|
|
559
|
+
stats.record(timer.read());
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
try results.append(allocator, BenchResult{
|
|
563
|
+
.name = name,
|
|
564
|
+
.min_ns = stats.min_ns,
|
|
565
|
+
.avg_ns = stats.avg(),
|
|
566
|
+
.max_ns = stats.max_ns,
|
|
567
|
+
.total_ns = stats.total_ns,
|
|
568
|
+
.iterations = iterations,
|
|
569
|
+
.mem_stats = null,
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// Delete line (removes marker)
|
|
575
|
+
{
|
|
576
|
+
const name = "Delete line: remove marker + rebuild (~200 markers)";
|
|
577
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
578
|
+
var stats = BenchStats{};
|
|
579
|
+
for (0..iterations) |_| {
|
|
580
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
581
|
+
defer arena.deinit();
|
|
582
|
+
|
|
583
|
+
var rope = try createRope(arena.allocator(), 10000, 50);
|
|
584
|
+
// Markers are automatically indexed in the tree structure
|
|
585
|
+
|
|
586
|
+
var timer = try std.time.Timer.start();
|
|
587
|
+
// Delete marker at position
|
|
588
|
+
const marker_pos = rope.getMarker(.marker, 50).?.leaf_index;
|
|
589
|
+
try rope.delete(marker_pos);
|
|
590
|
+
// Markers are automatically indexed in the tree structure
|
|
591
|
+
stats.record(timer.read());
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
try results.append(allocator, BenchResult{
|
|
595
|
+
.name = name,
|
|
596
|
+
.min_ns = stats.min_ns,
|
|
597
|
+
.avg_ns = stats.avg(),
|
|
598
|
+
.max_ns = stats.max_ns,
|
|
599
|
+
.total_ns = stats.total_ns,
|
|
600
|
+
.iterations = iterations,
|
|
601
|
+
.mem_stats = null,
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
return try results.toOwnedSlice(allocator);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
fn benchMemoryUsage(
|
|
610
|
+
allocator: std.mem.Allocator,
|
|
611
|
+
iterations: usize,
|
|
612
|
+
bench_filter: ?[]const u8,
|
|
613
|
+
) ![]BenchResult {
|
|
614
|
+
var results: std.ArrayListUnmanaged(BenchResult) = .{};
|
|
615
|
+
errdefer results.deinit(allocator);
|
|
616
|
+
|
|
617
|
+
// Memory comparison: with vs without marker index
|
|
618
|
+
{
|
|
619
|
+
const name = "Memory: 50k tokens WITHOUT marker index";
|
|
620
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
621
|
+
var stats = BenchStats{};
|
|
622
|
+
for (0..iterations) |_| {
|
|
623
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
624
|
+
defer arena.deinit();
|
|
625
|
+
|
|
626
|
+
const rope = try createRope(arena.allocator(), 50000, 50);
|
|
627
|
+
// Don't rebuild index - just measure rope creation
|
|
628
|
+
_ = rope;
|
|
629
|
+
|
|
630
|
+
const elapsed: u64 = 0; // Placeholder for memory measurement
|
|
631
|
+
stats.record(elapsed);
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
try results.append(allocator, BenchResult{
|
|
635
|
+
.name = name,
|
|
636
|
+
.min_ns = stats.min_ns,
|
|
637
|
+
.avg_ns = stats.avg(),
|
|
638
|
+
.max_ns = stats.max_ns,
|
|
639
|
+
.total_ns = stats.total_ns,
|
|
640
|
+
.iterations = iterations,
|
|
641
|
+
.mem_stats = null,
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
{
|
|
647
|
+
const name = "Memory: 50k tokens WITH marker index (~1k markers)";
|
|
648
|
+
if (bench_utils.matchesBenchFilter(name, bench_filter)) {
|
|
649
|
+
var stats = BenchStats{};
|
|
650
|
+
for (0..iterations) |_| {
|
|
651
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
652
|
+
defer arena.deinit();
|
|
653
|
+
|
|
654
|
+
const rope = try createRope(arena.allocator(), 50000, 50);
|
|
655
|
+
_ = rope; // Markers are automatically indexed in the tree structure
|
|
656
|
+
|
|
657
|
+
const elapsed: u64 = 0; // Placeholder for memory measurement
|
|
658
|
+
stats.record(elapsed);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
try results.append(allocator, BenchResult{
|
|
662
|
+
.name = name,
|
|
663
|
+
.min_ns = stats.min_ns,
|
|
664
|
+
.avg_ns = stats.avg(),
|
|
665
|
+
.max_ns = stats.max_ns,
|
|
666
|
+
.total_ns = stats.total_ns,
|
|
667
|
+
.iterations = iterations,
|
|
668
|
+
.mem_stats = null,
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
return try results.toOwnedSlice(allocator);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
pub fn run(
|
|
677
|
+
allocator: std.mem.Allocator,
|
|
678
|
+
show_mem: bool,
|
|
679
|
+
bench_filter: ?[]const u8,
|
|
680
|
+
) ![]BenchResult {
|
|
681
|
+
_ = show_mem;
|
|
682
|
+
|
|
683
|
+
var all_results: std.ArrayListUnmanaged(BenchResult) = .{};
|
|
684
|
+
errdefer all_results.deinit(allocator);
|
|
685
|
+
|
|
686
|
+
const iterations: usize = 10;
|
|
687
|
+
|
|
688
|
+
// Rebuild index benchmarks
|
|
689
|
+
const rebuild_results = try benchRebuildMarkerIndex(allocator, iterations, bench_filter);
|
|
690
|
+
try all_results.appendSlice(allocator, rebuild_results);
|
|
691
|
+
|
|
692
|
+
// Marker lookup benchmarks
|
|
693
|
+
const lookup_results = try benchMarkerLookup(allocator, iterations, bench_filter);
|
|
694
|
+
try all_results.appendSlice(allocator, lookup_results);
|
|
695
|
+
|
|
696
|
+
// Marker count benchmarks
|
|
697
|
+
const count_results = try benchMarkerCount(allocator, iterations, bench_filter);
|
|
698
|
+
try all_results.appendSlice(allocator, count_results);
|
|
699
|
+
|
|
700
|
+
// Tree depth impact
|
|
701
|
+
const depth_results = try benchDepthVsPerformance(allocator, iterations, bench_filter);
|
|
702
|
+
try all_results.appendSlice(allocator, depth_results);
|
|
703
|
+
|
|
704
|
+
// Edit workflows
|
|
705
|
+
const edit_results = try benchEditThenRebuild(allocator, iterations, bench_filter);
|
|
706
|
+
try all_results.appendSlice(allocator, edit_results);
|
|
707
|
+
|
|
708
|
+
// Memory usage comparison
|
|
709
|
+
const memory_results = try benchMemoryUsage(allocator, iterations, bench_filter);
|
|
710
|
+
try all_results.appendSlice(allocator, memory_results);
|
|
711
|
+
|
|
712
|
+
return try all_results.toOwnedSlice(allocator);
|
|
713
|
+
}
|