summaryrefslogtreecommitdiff
path: root/lua/clever_f/direct_preview_planner.lua
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 11:40:26 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 11:40:26 +0200
commit5574e26f6bf1152a50e28080ca200e447f1acade (patch)
tree495e2217af17648cc7d7d554e8d424d896c488b9 /lua/clever_f/direct_preview_planner.lua
parent07cb5088325b7272f8718bfaee9e85515ae6a81e (diff)
Scan direct previews on current line
Diffstat (limited to 'lua/clever_f/direct_preview_planner.lua')
-rw-r--r--lua/clever_f/direct_preview_planner.lua64
1 files changed, 64 insertions, 0 deletions
diff --git a/lua/clever_f/direct_preview_planner.lua b/lua/clever_f/direct_preview_planner.lua
new file mode 100644
index 0000000..7ead43f
--- /dev/null
+++ b/lua/clever_f/direct_preview_planner.lua
@@ -0,0 +1,64 @@
+local domain = require("clever_f.domain")
+local text_topology = require("clever_f.text_topology")
+
+local M = {}
+local DirectPreviewPlanner = {}
+DirectPreviewPlanner.__index = DirectPreviewPlanner
+M.DirectPreviewPlanner = DirectPreviewPlanner
+
+local planner_records = setmetatable({}, { __mode = "k" })
+
+local function fail(message, level)
+ error(message, (level or 1) + 1)
+end
+
+local function require_view(view)
+ if not text_topology.TextView.is(view) then
+ fail("direct preview text must be a TextView", 3)
+ end
+ return view
+end
+
+function DirectPreviewPlanner.new()
+ local planner = setmetatable({}, DirectPreviewPlanner)
+ planner_records[planner] = true
+ return planner
+end
+
+function DirectPreviewPlanner.is(value)
+ return type(value) == "table" and planner_records[value] == true
+end
+
+function DirectPreviewPlanner:scan_current_line(view, origin, direction)
+ require_view(view)
+ origin = domain.Position.coerce(origin)
+ direction = domain.Direction.from_string(direction)
+ local records = {}
+ for position, character, span in view:iterate(
+ direction,
+ view:line_match_start_bounds(origin.line)
+ ) do
+ records[#records + 1] = {
+ position = position,
+ character = character,
+ span = span,
+ }
+ end
+ return records
+end
+
+function M.new()
+ return DirectPreviewPlanner.new()
+end
+
+function M.scan_current_line(view, origin, direction)
+ return DirectPreviewPlanner.new():scan_current_line(view, origin, direction)
+end
+
+setmetatable(M, {
+ __call = function()
+ return DirectPreviewPlanner.new()
+ end,
+})
+
+return M