From 1c91b6610f5aa5231a482ea3dd78daa8b92cde19 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 9 Feb 2017 04:08:59 -0500 Subject: [PATCH] core/autoload/plist.el => mplist.el --- core/autoload/mplist.el | 65 +++++++++++++++++++++++++++++++++++++++++ core/autoload/plist.el | 44 ---------------------------- 2 files changed, 65 insertions(+), 44 deletions(-) create mode 100644 core/autoload/mplist.el delete mode 100644 core/autoload/plist.el diff --git a/core/autoload/mplist.el b/core/autoload/mplist.el new file mode 100644 index 000000000..13048442c --- /dev/null +++ b/core/autoload/mplist.el @@ -0,0 +1,65 @@ +;;; plist.el +(provide 'doom-lib-mplist) + +;; The built-in plist library won't work when the list is a malformed plist, +;; which is a plist who has multiple (or no) forms following its properties. For +;; example: (:x 5 :y 1 2 3 :z). +;; +;; This library was made for mplists, so use the standard plist-* functions for +;; regular plists. +;; +;; (let ((a '(abc :commands 1 :config 3 4 5))) +;; (@mplist a &delete :commands :config)) + +;;;###autoload +(defmacro @mplist (var action &rest args) + "A helper macro that makes dealing with doom-mplist-* functions a little more concise. + +Examples: + (@mplist plist &delete :x :y) + (@mplist plist &get :x)" + (declare (indent defun)) + (let ((fn-sym (intern (format "doom-mplist-%s" (substring (symbol-name action) 1))))) + (when (fboundp fn-sym) + (if (memq action '(&delete &put)) + `(setq ,var (,fn-sym ,var ,@args)) + `(,fn-sym ,var ,@args))))) + +;;;###autoload +(defun doom-mplist-delete (plist &rest keys) + "TODO" + (if (apply 'doom-mplist-member plist keys) + (let (forms) + (while plist + (if (not (and (keywordp (car plist)) (memq (car plist) keys))) + (setq forms (append forms (list (pop plist)))) + (pop plist) + (while (and plist (not (keywordp (car plist)))) + (pop plist)))) + forms) + plist)) + +;;;###autoload +(defun doom-mplist-put (plist key value) + "TODO" + (when (doom-mplist-member plist key) + (doom-mplist-delete plist key)) + (setq plist (append plist (list key value)))) + +;;;###autoload +(defun doom-mplist-get (plist &rest keys) + "TODO" + (if (cdr keys) + (let ((keys (--map (memq it plist) keys)) + values) + (dolist (forms keys) + (when forms + (push (cdr forms) values))) + values) + (cdr (memq (car keys) plist)))) + +;;;###autoload +(defun doom-mplist-member (plist &rest keys) + (--any-p (memq it plist) keys)) + + diff --git a/core/autoload/plist.el b/core/autoload/plist.el deleted file mode 100644 index fa9458783..000000000 --- a/core/autoload/plist.el +++ /dev/null @@ -1,44 +0,0 @@ -;;; plist.el -(provide 'doom-lib-plist) - -;;;###autoload -(defmacro @plist (var action &rest args) - "A helper macro that makes dealing with doom-plist-* functions a little more concise. - -Examples: - (@plist plist &delete :x :y) - (@plist plist &get :x)" - (declare (indent defun)) - (let ((fn-sym (intern (format "doom-plist-%s" (substring (symbol-name action) 1))))) - (when (fboundp fn-sym) - (if (memq action '(&delete &put)) - `(setq ,var (,fn-sym ,var ,@args)) - `(,fn-sym ,var ,@args))))) - -;;;###autoload -(defun doom-plist-delete (plist &rest keys) - (if (apply 'doom-plist-member plist keys) - (let (forms) - (while plist - (if (and (keywordp (car plist)) (memq (car plist) keys)) - (progn - (pop plist) - (while (and plist (not (keywordp (car plist)))) - (pop plist))) - (setq forms (append forms (list (pop plist)))))) - forms) - plist)) - -;;;###autoload -(defun doom-plist-put (plist key value &rest key-values)) - -;;;###autoload -(defun doom-plist-get (plist &rest keys)) - -;;;###autoload -(defun doom-plist-member (plist &rest keys) - (--any-p (memq it plist) keys)) - - -;; (let ((a '(abc :commands 1 :config 3 4 5))) -;; (@plist a &delete :commands :config))