summaryrefslogtreecommitdiff
path: root/lua/clever_f/direct_preview_planner.lua
blob: bc9592ab658f300b7e013d614f8b5536e7d6ba6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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:iter_strict(
    origin,
    direction,
    domain.SearchScope.CURRENT_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