summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:48:48 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:48:48 +0200
commit19904ba49a03a450e8a573358eb3417a3aafdb1f (patch)
tree6a9913234c77586483ac68fc501be8784ae357d0
parent23e121d2f74ad2dd1ab0902f120aa90bee2c7edb (diff)
Install sampled eager hooks
-rw-r--r--lua/clever_f/feedback_service.lua37
-rw-r--r--tests/run.lua30
2 files changed, 67 insertions, 0 deletions
diff --git a/lua/clever_f/feedback_service.lua b/lua/clever_f/feedback_service.lua
index d4fd7a7..72ee1dc 100644
--- a/lua/clever_f/feedback_service.lua
+++ b/lua/clever_f/feedback_service.lua
@@ -21,6 +21,11 @@ M.FINALIZER_EVENTS = {
"InsertEnter",
"TextChanged",
}
+M.EAGER_EVENTS = {
+ "WinEnter",
+ "WinLeave",
+ "CmdwinLeave",
+}
M.FinalizerAction = {
PRESERVE = "preserve",
FINALIZE = "finalize",
@@ -156,6 +161,7 @@ local function require_policy(service, host)
or type(service.sample_acquisition) ~= "function"
or type(service.sample_markers) ~= "function"
or type(service.sample_timeouts) ~= "function"
+ or type(service.capture_activation) ~= "function"
then
fail("FeedbackService policy must evaluate highlight links", 3)
end
@@ -183,6 +189,8 @@ function FeedbackService.new(options)
),
persistent_requests = {},
owned_finalizer = nil,
+ activation = nil,
+ eager_registration = nil,
}
return service
end
@@ -811,6 +819,35 @@ function FeedbackService:refresh_primary(resolved_target, window)
return self:start_highlight_timer(window)
end
+function FeedbackService:handle_eager_event()
+ return false
+end
+
+function FeedbackService:activate()
+ local record = service_records[self]
+ if record.activation ~= nil then
+ return copy(record.activation)
+ end
+ local sampled = record.policy:capture_activation()
+ local activation = {
+ clean_labels_eagerly = sampled.clean_labels_eagerly,
+ eager_registration = nil,
+ }
+ if sampled.clean_labels_eagerly then
+ local identity = record.host:register_events(
+ M.EAGER_EVENTS,
+ function(name, payload)
+ self:handle_eager_event(name, payload)
+ end,
+ { owner = "clever_f", lifecycle = "eager" }
+ )
+ record.eager_registration = identity
+ activation.eager_registration = identity
+ end
+ record.activation = activation
+ return copy(activation)
+end
+
function FeedbackService:evaluate_feature_links()
local record = service_records[self]
local rules = record.policy:evaluate_highlight_links()
diff --git a/tests/run.lua b/tests/run.lua
index 4d512be..7947ab1 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -6899,6 +6899,36 @@ test("Explicit motion execution bypasses primary feedback operations", function(
same(0, refresh_count)
end)
+test("Activation installs eager hooks from sampled setup policy", function()
+ fresh_sequence_state()
+ local enabled_host = MemoryHost.new({
+ configuration = { clean_labels_eagerly = true },
+ })
+ local enabled = feedback_service.new(enabled_host)
+ local activation = enabled:activate()
+ truthy(activation.clean_labels_eagerly)
+ truthy(activation.eager_registration ~= nil)
+ local registration = enabled_host:event_registrations()[
+ activation.eager_registration
+ ]
+ list_same(feedback_service.EAGER_EVENTS, registration.names)
+ same("eager", registration.options.lifecycle)
+
+ enabled_host:set_configuration("clean_labels_eagerly", false)
+ local retained = enabled:activate()
+ same(activation.eager_registration, retained.eager_registration)
+ truthy(retained.clean_labels_eagerly)
+
+ fresh_sequence_state()
+ local disabled_host = MemoryHost.new({
+ configuration = { clean_labels_eagerly = false },
+ })
+ local disabled = feedback_service.new(disabled_host):activate()
+ falsy(disabled.clean_labels_eagerly)
+ same(nil, disabled.eager_registration)
+ same(0, map_size(disabled_host:event_registrations()))
+end)
+
for _, item in ipairs(tests) do
local ok, failure = xpcall(item.body, debug.traceback)
if not ok then