summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lua/clever_f/sequence_coordinator.lua38
-rw-r--r--tests/run.lua24
2 files changed, 62 insertions, 0 deletions
diff --git a/lua/clever_f/sequence_coordinator.lua b/lua/clever_f/sequence_coordinator.lua
index cb6bf80..c43d244 100644
--- a/lua/clever_f/sequence_coordinator.lua
+++ b/lua/clever_f/sequence_coordinator.lua
@@ -470,6 +470,37 @@ function SequenceCoordinator:last_primary_resolution()
return coordinator_records[self].last_primary_resolution
end
+function SequenceCoordinator:read_explicit_invocation()
+ local host = coordinator_records[self].host
+ if type(host) ~= "table"
+ or type(host.read_mode) ~= "function"
+ or type(host.read_cursor) ~= "function"
+ or type(host.read_count) ~= "function"
+ then
+ fail("SequenceCoordinator host must provide explicit action state", 2)
+ end
+ local position = domain.Position.coerce(host:read_cursor())
+ return {
+ context = domain.ModeContext.from_full_mode(host:read_mode()),
+ position = position,
+ origin = position,
+ count = domain.Count.new(host:read_count()),
+ }
+end
+
+function SequenceCoordinator:resolve_explicit_same()
+ local invocation = self:read_explicit_invocation()
+ local resolver = coordinator_records[self].repeat_resolver
+ if type(resolver.same_direction_request) ~= "function" then
+ fail("RepeatResolver must build same-direction requests", 2)
+ end
+ return {
+ kind = "explicit_same",
+ invocation = invocation,
+ request = resolver:same_direction_request(invocation.context),
+ }
+end
+
function SequenceCoordinator:primary(value)
local descriptor = self:validate_primary_descriptor(value)
local invocation = self:read_primary_invocation()
@@ -506,6 +537,13 @@ function SequenceCoordinator:primary(value)
)
end
+function SequenceCoordinator:repeat_same_direction()
+ return self:resolve_explicit_same()
+end
+
+SequenceCoordinator.RepeatSameDirection =
+ SequenceCoordinator.repeat_same_direction
+
function M.new(options)
return SequenceCoordinator.new(options)
end
diff --git a/tests/run.lua b/tests/run.lua
index 7e49e62..db19ffa 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -7706,6 +7706,30 @@ test("ActionFacade returns typed primary action outcomes", function()
end, "clever-f: Invalid mapping 'x'")
end)
+test("Same-direction explicit coordination reads current-context state", function()
+ local _, transitions = fresh_sequence_state()
+ local normal_target = target("a")
+ local visual_target = target("b")
+ transitions:BeginAcquisition("n", "F")
+ transitions:CommitAcquiredTarget("n", normal_target)
+ transitions:BeginAcquisition("v", "t")
+ transitions:CommitAcquiredTarget("v", visual_target)
+ local host = MemoryHost.new({
+ mode = "v",
+ count = 2,
+ cursor = { line = 1, byte_column = 3 },
+ })
+
+ local resolution = sequence_coordinator.new({ host = host })
+ :repeat_same_direction()
+
+ same("explicit_same", resolution.kind)
+ same(domain.ModeContext.from_full_mode("v"), resolution.invocation.context)
+ same(2, resolution.invocation.count.value)
+ same(domain.Descriptor.TILL_FORWARD, resolution.request.descriptor)
+ same(visual_target, resolution.request.target)
+end)
+
for _, item in ipairs(tests) do
local ok, failure = xpcall(item.body, debug.traceback)
if not ok then