diff options
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/clever_f/direct_preview_planner.lua | 64 |
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 |
