2019-08-06 14:45:55 -04:00
|
|
|
;;; core/autoload/plist.el -*- lexical-binding: t; -*-
|
2019-07-22 18:04:50 +02:00
|
|
|
|
|
|
|
;;
|
|
|
|
;;; Macros
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(cl-defmacro doplist! ((arglist plist &optional retval) &rest body)
|
|
|
|
"Loop over a PLIST's (property value) pairs then return RETVAL.
|
|
|
|
|
|
|
|
Evaluate BODY with either ARGLIST bound to (cons PROP VAL) or, if ARGLIST is a
|
|
|
|
list, the pair is destructured into (CAR . CDR)."
|
2019-11-17 16:47:56 -05:00
|
|
|
(declare (indent 1))
|
2019-07-22 18:04:50 +02:00
|
|
|
(let ((plist-var (make-symbol "plist")))
|
2019-10-26 01:46:32 -04:00
|
|
|
`(let ((,plist-var (copy-sequence ,plist)))
|
2019-07-22 18:04:50 +02:00
|
|
|
(while ,plist-var
|
|
|
|
(let ,(if (listp arglist)
|
|
|
|
`((,(pop arglist) (pop ,plist-var))
|
|
|
|
(,(pop arglist) (pop ,plist-var)))
|
|
|
|
`((,arglist (cons (pop ,plist-var)
|
|
|
|
(pop ,plist-var)))))
|
2019-07-28 14:14:42 +02:00
|
|
|
,@body))
|
|
|
|
,retval)))
|
2019-07-22 18:04:50 +02:00
|
|
|
|
|
|
|
;;;###autoload
|
2019-11-01 23:52:31 -04:00
|
|
|
(defmacro plist-put! (plist &rest rest)
|
|
|
|
"Set each PROP VALUE pair in REST to PLIST in-place."
|
|
|
|
`(cl-loop for (prop value)
|
|
|
|
on (list ,@rest) by #'cddr
|
|
|
|
do ,(if (symbolp plist)
|
|
|
|
`(setq ,plist (plist-put ,plist prop value))
|
|
|
|
`(plist-put ,plist prop value))))
|
2019-07-22 18:04:50 +02:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defmacro plist-delete! (plist prop)
|
|
|
|
"Delete PROP from PLIST in-place."
|
|
|
|
`(setq ,plist (doom-plist-delete ,plist ,prop)))
|
|
|
|
|
2019-07-22 22:28:43 +02:00
|
|
|
|
|
|
|
;;
|
|
|
|
;;; Library
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom-plist-get (plist prop &optional nil-value)
|
|
|
|
"Return PROP in PLIST, if it exists. Otherwise NIL-VALUE."
|
|
|
|
(if-let (val (plist-member plist prop))
|
|
|
|
(cadr val)
|
|
|
|
nil-value))
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom-plist-merge (from-plist to-plist)
|
2020-01-04 04:55:57 -05:00
|
|
|
"Non-destructively merge FROM-PLIST onto TO-PLIST"
|
2019-07-28 14:14:42 +02:00
|
|
|
(let ((plist (copy-sequence from-plist)))
|
|
|
|
(while plist
|
|
|
|
(plist-put! to-plist (pop plist) (pop plist)))
|
|
|
|
to-plist))
|
2019-07-22 22:28:43 +02:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom-plist-delete-nil (plist)
|
|
|
|
"Delete `nil' properties from a copy of PLIST."
|
|
|
|
(let (p)
|
|
|
|
(while plist
|
|
|
|
(if (car plist)
|
|
|
|
(plist-put! p (car plist) (nth 1 plist)))
|
|
|
|
(setq plist (cddr plist)))
|
|
|
|
p))
|
|
|
|
|
|
|
|
;;;###autoload
|
2020-01-30 16:58:31 -05:00
|
|
|
(defun doom-plist-delete (plist &rest props)
|
|
|
|
"Delete PROPS from a copy of PLIST."
|
2019-07-22 22:28:43 +02:00
|
|
|
(let (p)
|
|
|
|
(while plist
|
2020-01-30 16:58:31 -05:00
|
|
|
(if (not (memq (car plist) props))
|
2019-07-22 22:28:43 +02:00
|
|
|
(plist-put! p (car plist) (nth 1 plist)))
|
|
|
|
(setq plist (cddr plist)))
|
|
|
|
p))
|