summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 11:09:44 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 11:09:44 +0200
commit39bd7cca604d1d9d3b07a1861706e637441be7a8 (patch)
tree402452d38422b5b7c77a66a1b0a8b43988df22bc /lua
parentd44346e4195637dccd28d2908c11d4aea373043f (diff)
Resolve relative lowercase direction
Diffstat (limited to 'lua')
-rw-r--r--lua/clever_f/repeat_resolver.lua48
1 files changed, 46 insertions, 2 deletions
diff --git a/lua/clever_f/repeat_resolver.lua b/lua/clever_f/repeat_resolver.lua
index 4cb1294..fbb50c6 100644
--- a/lua/clever_f/repeat_resolver.lua
+++ b/lua/clever_f/repeat_resolver.lua
@@ -28,9 +28,10 @@ end
local function require_policy(service)
if service ~= nil and (type(service) ~= "table"
- or type(service.sample_timeouts) ~= "function")
+ or type(service.sample_timeouts) ~= "function"
+ or type(service.sample_direction) ~= "function")
then
- fail("RepeatResolver policy must provide sample_timeouts", 3)
+ fail("RepeatResolver policy must sample timeouts and direction", 3)
end
return service
end
@@ -181,6 +182,49 @@ end
RepeatResolver.check_timeout = RepeatResolver.evaluate_timeout
RepeatResolver.resolve_timeout = RepeatResolver.evaluate_timeout
+local function sampled_fixed_direction(resolver)
+ local service = resolver_records[resolver].policy
+ if service == nil then
+ fail("RepeatResolver requires a policy to resolve primary direction", 3)
+ end
+ local sampled = service:sample_direction()
+ local fixed
+ if type(sampled) == "table" then
+ fixed = sampled.fix_key_direction
+ end
+ if type(fixed) ~= "boolean" then
+ fail("fix_key_direction sample must be a Boolean", 3)
+ end
+ return fixed
+end
+
+function M.primary_direction(stored_descriptor, pressed_key, fix_key_direction)
+ local stored = domain.Descriptor.from_string(stored_descriptor)
+ local pressed = domain.Descriptor.from_string(pressed_key)
+ if type(fix_key_direction) ~= "boolean" then
+ fail("fix_key_direction must be a Boolean", 2)
+ end
+ if not fix_key_direction and domain.Descriptor.is_lowercase(pressed) then
+ return stored
+ end
+ return nil
+end
+
+M.resolve_primary_direction = M.primary_direction
+M.effective_primary_descriptor = M.primary_direction
+
+function RepeatResolver:resolve_primary_direction(stored_descriptor, pressed_key)
+ return M.primary_direction(
+ stored_descriptor,
+ pressed_key,
+ sampled_fixed_direction(self)
+ )
+end
+
+RepeatResolver.primary_direction = RepeatResolver.resolve_primary_direction
+RepeatResolver.effective_primary_descriptor =
+ RepeatResolver.resolve_primary_direction
+
function M.new(options)
return RepeatResolver.new(options)
end