diff options
| author | Thanos Apollo <public@thanosapollo.org> | 2026-04-26 03:09:51 +0300 |
|---|---|---|
| committer | Thanos Apollo <public@thanosapollo.org> | 2026-04-26 03:09:51 +0300 |
| commit | b5b04a2f4ffe69d0676a59c3cb11105dce58ec59 (patch) | |
| tree | 0e61e976780ceffb445d0f8e7c941340126acb80 | |
| parent | 0b9d4e08bd2e72df94d167b32b66cc7ea99e38f7 (diff) | |
keymap-popup: Extract --map-groups to deduplicate row traversal
| -rw-r--r-- | keymap-popup.el | 53 |
1 files changed, 23 insertions, 30 deletions
diff --git a/keymap-popup.el b/keymap-popup.el index 3813813..077a5f4 100644 --- a/keymap-popup.el +++ b/keymap-popup.el @@ -302,43 +302,36 @@ KEY (DESC ...) pairs." ;;; Public API -(defun keymap-popup--group-exists-p (rows group-name) - "Return non-nil if GROUP-NAME exists in ROWS." - (cl-loop for row in rows - thereis (cl-loop for group in row - thereis (equal (plist-get group :name) group-name)))) - -(defun keymap-popup--append-to-group (rows entry group-name) - "Return ROWS with ENTRY appended to groups matching GROUP-NAME." - (mapcar (lambda (row) - (mapcar (lambda (group) - (if (equal (plist-get group :name) group-name) - (list :name (plist-get group :name) - :entries (append (plist-get group :entries) - (list entry))) - group)) - row)) - rows)) +(defun keymap-popup--map-groups (rows fn) + "Apply FN to each group in ROWS, returning the transformed rows. +FN receives a group plist and returns a new group plist." + (mapcar (lambda (row) (mapcar fn row)) rows)) (defun keymap-popup--add-entry-to-rows (rows entry group-name) "Return ROWS with ENTRY appended to the group named GROUP-NAME. Falls back to the first group if GROUP-NAME is not found." - (keymap-popup--append-to-group - rows entry - (if (keymap-popup--group-exists-p rows group-name) - group-name - (plist-get (caar rows) :name)))) + (let ((target (or (cl-loop for row in rows + thereis (cl-loop for g in row + when (equal (plist-get g :name) group-name) + return group-name)) + (plist-get (caar rows) :name)))) + (keymap-popup--map-groups + rows + (lambda (group) + (if (equal (plist-get group :name) target) + (list :name (plist-get group :name) + :entries (append (plist-get group :entries) (list entry))) + group))))) (defun keymap-popup--remove-key-from-rows (rows key) "Return ROWS with entries matching KEY filtered out." - (mapcar (lambda (row) - (mapcar (lambda (group) - (list :name (plist-get group :name) - :entries (cl-remove-if - (lambda (e) (equal (plist-get e :key) key)) - (plist-get group :entries)))) - row)) - rows)) + (keymap-popup--map-groups + rows + (lambda (group) + (list :name (plist-get group :name) + :entries (cl-remove-if + (lambda (e) (equal (plist-get e :key) key)) + (plist-get group :entries)))))) ;;;###autoload (defun keymap-popup-add-entry (map-symbol key description command &optional group) |
