summaryrefslogtreecommitdiff
path: root/lua/clever_f/acquisition_service.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/clever_f/acquisition_service.lua')
-rw-r--r--lua/clever_f/acquisition_service.lua27
1 files changed, 27 insertions, 0 deletions
diff --git a/lua/clever_f/acquisition_service.lua b/lua/clever_f/acquisition_service.lua
index 45463e6..bf3a5e9 100644
--- a/lua/clever_f/acquisition_service.lua
+++ b/lua/clever_f/acquisition_service.lua
@@ -140,6 +140,8 @@ function AcquisitionResult.new(request, options)
motion_plan = options.motion_plan,
resolved_motion_plan = options.motion_plan,
previous_input_trigger = options.previous_input_trigger,
+ previous_target_source = options.previous_target_source,
+ cached_target = options.cached_target,
completed = outcome ~= nil or target ~= nil,
}
return result
@@ -182,6 +184,8 @@ function TemporaryResourceScope.new(request, feedback)
input_packet = nil,
acquired_target = nil,
previous_input_trigger = nil,
+ previous_target_source = nil,
+ cached_target = nil,
outcome = nil,
}
return scope
@@ -224,6 +228,11 @@ function TemporaryResourceScope:set_previous_input_trigger(trigger)
return set_scope_resource(self, "previous_input_trigger", trigger)
end
+function TemporaryResourceScope:set_cached_target(context, target)
+ set_scope_resource(self, "previous_target_source", context)
+ return set_scope_resource(self, "cached_target", target)
+end
+
function TemporaryResourceScope:set_outcome(outcome)
if not domain.ActionOutcome.is(outcome) then
fail("temporary resource scope outcome must be an ActionOutcome", 2)
@@ -325,6 +334,7 @@ function AcquisitionService.new(options, dependencies)
service_records[service] = {
host = options.host,
policy = policy_service,
+ state = state,
transitions = transitions,
feedback = require_feedback(
options.feedback or options.feedback_service,
@@ -486,6 +496,17 @@ function M.normalize_input_packet(packet)
return M.normalize_ordinary_input(domain.InputPacket.text(encoded))
end
+function M.read_previous_target(state)
+ if not sequence_state.is(state) then
+ fail("previous-input reuse requires SequenceState", 2)
+ end
+ local context = state.last_input_context
+ if context == nil then
+ return nil, nil
+ end
+ return state:get_previous_target(context), context
+end
+
function M.match_previous_input_trigger(first_code, triggers)
if type(first_code) ~= "number" or first_code < 0 then
fail("acquired first code must be nonnegative", 2)
@@ -608,9 +629,15 @@ function AcquisitionService:acquire(descriptor, context, position, count, macro_
previous_input.repeat_last_char_inputs
)
)
+ if trigger ~= nil then
+ local cached_target, source = M.read_previous_target(record.state)
+ scope:set_cached_target(source, cached_target)
+ end
return AcquisitionResult.new(request, {
target = target,
previous_input_trigger = trigger,
+ previous_target_source = scope.previous_target_source,
+ cached_target = scope.cached_target,
})
end