diff options
author | William Carroll <wpcarro@gmail.com> | 2020-01-20T10·16+0000 |
---|---|---|
committer | William Carroll <wpcarro@gmail.com> | 2020-01-22T21·13+0000 |
commit | 64cf4ac920915ae3022aecbffe80c71af9d22bed (patch) | |
tree | ab4d5a259adcdfa932ffdd937cefad24c9636139 | |
parent | 0c59df832714c09f9dbf881bf352507916999d2d (diff) |
Begin supporting list/index
This currently doesn't work and as such is a work-in-progress.
-rw-r--r-- | configs/shared/.emacs.d/wpc/list.el | 22 |
1 files changed, 22 insertions, 0 deletions
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)) |