diff options
| author | Jackson Moore <jacksonmoore@tuta.io> | 2026-09-04 13:45:53 +0200 |
|---|---|---|
| committer | Jackson Moore <jacksonmoore@tuta.io> | 2026-09-04 13:45:53 +0200 |
| commit | b59eafa9e512cc0334c6e363e0cb811065f1f7d7 (patch) | |
| tree | 3bfd00b0945d657a2ec982139223901e67f0980c | |
| parent | ab2fca82cf676583efc9a5897de0dd7f07c053ef (diff) | |
Read same-direction repeat state
| -rw-r--r-- | lua/clever_f/sequence_coordinator.lua | 38 | ||||
| -rw-r--r-- | tests/run.lua | 24 |
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 |
