From 64cf4ac920915ae3022aecbffe80c71af9d22bed Mon Sep 17 00:00:00 2001 From: William Carroll Date: Mon, 20 Jan 2020 10:16:35 +0000 Subject: Begin supporting list/index This currently doesn't work and as such is a work-in-progress. --- configs/shared/.emacs.d/wpc/list.el | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'configs') diff --git a/configs/shared/.emacs.d/wpc/list.el b/configs/shared/.emacs.d/wpc/list.el index 1ea5c18a7274..5a63c8bd94e0 100644 --- a/configs/shared/.emacs.d/wpc/list.el +++ b/configs/shared/.emacs.d/wpc/list.el @@ -124,6 +124,28 @@ "Return over `XS' calling `F' on an element in `XS'and `ACC'." (-reduce-from (lambda (acc x) (funcall f x acc)) acc xs)) +;; TODO: Support this. It seems like `alist/set' is not working as I expected it +;; to. Perhaps we should add some tests to confirm the expected behavior. +;; (cl-defun list/index (f xs &key (transform (lambda (x) x))) +;; "Return a mapping of F applied to each x in XS to TRANSFORM applied to x. +;; The TRANSFORM function defaults to the identity function." +;; (->> xs +;; (list/reduce (alist/new) +;; (lambda (x acc) +;; (let ((k (funcall f x)) +;; (v (funcall transform x))) +;; (if (alist/has-key? k acc) +;; (setf (alist-get k acc) (list v)) +;; (setf (alist-get k acc) (list v)))))))) +;; (prelude/assert +;; (equal '(("John" . ("Cleese" "Malkovich")) +;; ("Thomas" . ("Aquinas"))) +;; (list/index (lambda (x) (plist-get x :first-name)) +;; '((:first-name "John" :last-name "Cleese") +;; (:first-name "John" :last-name "Malkovich") +;; (:first-name "Thomas" :last-name "Aquinas")) +;; :transform (lambda (x) (plist-get x :last-name))))) + (defun list/map (f xs) "Call `F' on each element of `XS'." (-map f xs)) -- cgit 1.4.1