summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lua/clever_f/repeat_resolver.lua25
-rw-r--r--tests/run.lua13
2 files changed, 38 insertions, 0 deletions
diff --git a/lua/clever_f/repeat_resolver.lua b/lua/clever_f/repeat_resolver.lua
index 1b74420..086282b 100644
--- a/lua/clever_f/repeat_resolver.lua
+++ b/lua/clever_f/repeat_resolver.lua
@@ -5,6 +5,13 @@ local M = {}
local RepeatResolver = {}
M.RepeatResolver = RepeatResolver
+M.Decision = {
+ ACQUIRE = "acquire",
+ REPEAT = "repeat",
+}
+M.ACQUIRE = M.Decision.ACQUIRE
+M.REPEAT = M.Decision.REPEAT
+
local resolver_records = setmetatable({}, { __mode = "k" })
local function fail(message, level)
@@ -55,6 +62,18 @@ function RepeatResolver:previous_landing(context)
return resolver_records[self].state:get_previous_landing(context)
end
+function RepeatResolver:decide(context, current_position)
+ current_position = domain.Position.coerce(current_position)
+ local landing = self:previous_landing(context)
+ if landing == nil or not domain.Position.equal(landing, current_position) then
+ return M.Decision.ACQUIRE
+ end
+ return nil
+end
+
+RepeatResolver.eligibility = RepeatResolver.decide
+RepeatResolver.resolve_eligibility = RepeatResolver.decide
+
function M.new(options)
return RepeatResolver.new(options)
end
@@ -63,6 +82,12 @@ M.landing = function(context, options)
return RepeatResolver.new(options):previous_landing(context)
end
+function M.decide(context, current_position, options)
+ return RepeatResolver.new(options):decide(context, current_position)
+end
+
+M.eligibility = M.decide
+
setmetatable(M, {
__call = function(_, options)
return RepeatResolver.new(options)
diff --git a/tests/run.lua b/tests/run.lua
index 3095e6d..d5b97da 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -3803,6 +3803,19 @@ test("RepeatResolver reads the normalized contextual landing", function()
end, "immutable")
end)
+test("Primary eligibility acquires for missing and different landings", function()
+ local _, transitions = fresh_sequence_state()
+ local resolver = repeat_resolver.new()
+ local current = domain.Position.new(2, 4)
+
+ same(repeat_resolver.Decision.ACQUIRE, resolver:decide("n", current))
+
+ transitions:BeginAcquisition("n", "f")
+ transitions:CommitCommandSuccess("n", domain.Position.new(2, 5), true)
+ same(repeat_resolver.Decision.ACQUIRE, resolver:decide("n", current))
+ same(nil, resolver:decide("n", domain.Position.new(2, 5)))
+end)
+
for _, item in ipairs(tests) do
local ok, failure = xpcall(item.body, debug.traceback)
if not ok then