summaryrefslogtreecommitdiff
path: root/lua/clever_f/motion_plan.lua
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 18:44:32 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 18:44:32 +0200
commitc7b14ffb6d14969c9c41864e827f33f8e80fc24e (patch)
treec7c0ac23dc93a4a8b75449d2be4d0e05c4f05f9e /lua/clever_f/motion_plan.lua
parent9013636a57144e1f57c9339e7888d588430aae6a (diff)
Rename plugin to clever-tee
Diffstat (limited to 'lua/clever_f/motion_plan.lua')
-rw-r--r--lua/clever_f/motion_plan.lua188
1 files changed, 0 insertions, 188 deletions
diff --git a/lua/clever_f/motion_plan.lua b/lua/clever_f/motion_plan.lua
deleted file mode 100644
index 1d0b4e3..0000000
--- a/lua/clever_f/motion_plan.lua
+++ /dev/null
@@ -1,188 +0,0 @@
-local domain = require("clever_f.domain")
-
-local M = {}
-local MotionPlanFactory = {}
-M.MotionPlanFactory = MotionPlanFactory
-
-local factory_records = setmetatable({}, { __mode = "k" })
-
-local function fail(message, level)
- error(message, (level or 1) + 1)
-end
-
-local function normalize_options(options)
- if options == nil then
- return {}
- end
- if type(options) == "table" and type(options.sample_search) == "function" then
- return { policy = options }
- end
- if type(options) ~= "table" then
- fail("MotionPlanFactory options must be a table", 3)
- end
- return options
-end
-
-local function require_policy(service)
- if service ~= nil and (type(service) ~= "table"
- or type(service.sample_search) ~= "function")
- then
- fail("MotionPlanFactory policy must provide sample_search", 3)
- end
- return service
-end
-
-local factory_metatable = {
- __index = MotionPlanFactory,
- __newindex = function()
- fail("MotionPlanFactory values are immutable", 2)
- end,
- __tostring = function()
- return "motion-plan-factory"
- end,
- __metatable = "clever_f.motion_plan.MotionPlanFactory",
-}
-
-function MotionPlanFactory.new(options)
- if MotionPlanFactory.is(options) then
- return options
- end
- options = normalize_options(options)
- local factory = setmetatable({}, factory_metatable)
- factory_records[factory] = {
- policy = require_policy(options.policy or options.policy_service),
- }
- return factory
-end
-
-function MotionPlanFactory.is(value)
- return type(value) == "table" and factory_records[value] ~= nil
-end
-
-local function resolved_scope(factory, search_scope)
- if search_scope == nil then
- local policy = factory_records[factory].policy
- if policy ~= nil then
- search_scope = policy:sample_search().search_scope
- else
- search_scope = domain.SearchScope.BUFFER
- end
- elseif search_scope == "line" then
- search_scope = domain.SearchScope.CURRENT_LINE
- end
- return domain.SearchScope.from_string(search_scope)
-end
-
-function MotionPlanFactory:build(
- target_plan,
- effective_descriptor,
- search_scope,
- endpoint_policy
-)
- if not domain.TargetPlan.is(target_plan) then
- fail("motion target plan must be a TargetPlan", 2)
- end
-
- return domain.ResolvedMotionPlan.new({
- target_plan = target_plan,
- descriptor = effective_descriptor,
- search_scope = resolved_scope(self, search_scope),
- endpoint_policy = endpoint_policy or domain.EndpointPolicy.REGULAR,
- })
-end
-
-local function selection_option(selection)
- if selection == nil then
- return domain.SelectionOption.INCLUSIVE
- end
- if domain.Selection.is(selection) then
- return selection.option
- end
- if domain.SelectionOption.is(selection) then
- return selection
- end
- if type(selection) == "table" and selection.option ~= nil then
- return domain.SelectionOption.from_string(selection.option)
- end
- return domain.SelectionOption.from_string(selection)
-end
-
-function M.endpoint_policy(context, selection)
- context = domain.ModeContext.from_full_mode(context)
- local option = selection_option(selection)
- local visual_kind = context.visual_kind
- if option == domain.SelectionOption.EXCLUSIVE
- and (visual_kind == domain.SelectionKind.CHARACTER
- or visual_kind == domain.SelectionKind.LINE)
- then
- return domain.EndpointPolicy.VISUAL_EXCLUSIVE
- end
- return domain.EndpointPolicy.REGULAR
-end
-
-function MotionPlanFactory:endpoint_policy(context, selection)
- return M.endpoint_policy(context, selection)
-end
-
-function MotionPlanFactory:build_for_context(
- target_plan,
- effective_descriptor,
- context,
- selection,
- search_scope
-)
- return self:build(
- target_plan,
- effective_descriptor,
- search_scope,
- self:endpoint_policy(context, selection)
- )
-end
-
-function M.new(options)
- return MotionPlanFactory.new(options)
-end
-
-function M.build(
- target_plan,
- effective_descriptor,
- search_scope,
- endpoint_policy,
- options
-)
- return MotionPlanFactory.new(options):build(
- target_plan,
- effective_descriptor,
- search_scope,
- endpoint_policy
- )
-end
-
-function M.build_for_context(
- target_plan,
- effective_descriptor,
- context,
- selection,
- search_scope,
- options
-)
- return MotionPlanFactory.new(options):build_for_context(
- target_plan,
- effective_descriptor,
- context,
- selection,
- search_scope
- )
-end
-
-M.create = M.build
-M.resolve = M.build
-M.for_context = M.build_for_context
-
-setmetatable(M, {
- __call = function(_, options)
- return MotionPlanFactory.new(options)
- end,
-})
-
-return M