summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lua/clever_f/repeat_resolver.lua22
-rw-r--r--tests/run.lua15
2 files changed, 37 insertions, 0 deletions
diff --git a/lua/clever_f/repeat_resolver.lua b/lua/clever_f/repeat_resolver.lua
index 8f40059..057c7e6 100644
--- a/lua/clever_f/repeat_resolver.lua
+++ b/lua/clever_f/repeat_resolver.lua
@@ -253,6 +253,28 @@ end
RepeatResolver.resolve_explicit_same = RepeatResolver.same_direction_request
RepeatResolver.explicit_same = RepeatResolver.same_direction_request
+function M.build_opposite_direction_request(stored_descriptor, stored_target)
+ return domain.ExplicitRepeatRequest.new(
+ domain.Descriptor.swap(stored_descriptor),
+ stored_target
+ )
+end
+
+M.explicit_opposite_direction = M.build_opposite_direction_request
+
+function RepeatResolver:opposite_direction_request(context)
+ context = domain.ModeContext.from_full_mode(context)
+ local state = resolver_records[self].state
+ return M.build_opposite_direction_request(
+ state:get_previous_descriptor(context),
+ state:get_previous_target(context)
+ )
+end
+
+RepeatResolver.resolve_explicit_opposite =
+ RepeatResolver.opposite_direction_request
+RepeatResolver.explicit_opposite = RepeatResolver.opposite_direction_request
+
function M.new(options)
return RepeatResolver.new(options)
end
diff --git a/tests/run.lua b/tests/run.lua
index f60dbc6..4b6f1c7 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -4111,6 +4111,21 @@ test("Explicit same-direction requests use the stored descriptor", function()
end, "immutable")
end)
+test("Explicit opposite-direction requests swap the stored descriptor", function()
+ local _, transitions = fresh_sequence_state()
+ local stored_target = target("x")
+ local resolver = repeat_resolver.new()
+
+ for _, stored in ipairs({ "f", "F", "t", "T" }) do
+ transitions:BeginAcquisition("n", stored)
+ transitions:CommitAcquiredTarget("n", stored_target)
+ local request = resolver:opposite_direction_request("n")
+ same(domain.Descriptor.swap(stored), request.descriptor)
+ same(stored_target, request.target)
+ falsy(request.neutral)
+ end
+end)
+
for _, item in ipairs(tests) do
local ok, failure = xpcall(item.body, debug.traceback)
if not ok then