feat(lib): add doom-plist-{map,map*}

This commit is contained in:
Henrik Lissner
2024-11-15 03:55:16 -05:00
parent 7bc39f2c14
commit fa0a83ff2f

View File

@ -26,6 +26,36 @@
(cadr val)
nil-value))
;;;###autoload
(defun doom-plist-map (fn plist)
"Map FN on each keyword/value pair in PLIST.
FN is a function that takes two arguments: a keyword and value, and its return
values are accumulated ala `mapcar'."
(cl-loop for (key val) on plist by #'cddr
while (keywordp key)
do (plist-put plist key (funcall fn key val))))
;;;###autoload
(defun doom-plist-map* (fn vplist)
"Apply FN to each variadic property in VPLIST.
FN is a variadic function, whose first argument is the keyword and the rest the
values that follow (until the next keyword). Its return value is accumulated ala
`mapcar'.
VPLIST is a variadic-property list (a plist whose key may be followed by one or
more values)."
(let ((vplist (copy-sequence vplist))
results)
(while vplist
(let ((prop (pop vplist))
vals)
(while (and vplist (not (keywordp (car vplist))))
(push (pop vplist) vals))
(push (funcall fn prop (nreverse vals)) results)))
(nreverse results)))
;;;###autoload
(defun doom-plist-merge (from-plist to-plist)
"Non-destructively merge FROM-PLIST onto TO-PLIST"