[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/dash 1120417 127/426: Add -group-by
From: |
Phillip Lord |
Subject: |
[elpa] externals/dash 1120417 127/426: Add -group-by |
Date: |
Tue, 04 Aug 2015 19:37:09 +0000 |
branch: externals/dash
commit 1120417d5314452a30cb6085525dbb8c2be7d943
Author: Takafumi Arakaki <address@hidden>
Commit: Takafumi Arakaki <address@hidden>
Add -group-by
---
dash.el | 32 ++++++++++++++++++++++++++++++++
1 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/dash.el b/dash.el
index 4103eae..a5e40bb 100644
--- a/dash.el
+++ b/dash.el
@@ -405,6 +405,38 @@ The last group may contain less than N items."
"Applies FN to each value in LIST, splitting it each time FN returns a new
value."
(--partition-by (funcall fn it) list))
+(defmacro --group-by (form list)
+ "Anaphoric form of `-group-by'."
+ (let ((l (make-symbol "list"))
+ (v (make-symbol "value"))
+ (k (make-symbol "key"))
+ (r (make-symbol "result")))
+ `(let ((,l ,list)
+ ,r)
+ ;; Convert `list' to an alist and store it in `r'.
+ (while ,l
+ (let* ((,v (car ,l))
+ (it ,v)
+ (,k ,form)
+ (kv (assoc ,k ,r)))
+ (if kv
+ (setcdr kv (cons ,v (cdr kv)))
+ (push (list ,k ,v) ,r))
+ (setq ,l (cdr ,l))))
+ ;; Reverse lists in each group.
+ (let ((rest ,r))
+ (while rest
+ (let ((kv (car rest)))
+ (setcdr kv (nreverse (cdr kv))))
+ (setq rest (cdr rest))))
+ ;; Reverse order of keys.
+ (nreverse ,r))))
+
+(defun -group-by (fn list)
+ "Separate LIST into an alist whose keys are FN applied to the
+elements of LIST. Keys are compared by `equal'."
+ (--group-by (funcall fn it) list))
+
(defun -interpose (sep list)
"Returns a new list of all elements in LIST separated by SEP."
(let (result)
- [elpa] externals/dash 9faa422 115/426: Add -partition-by, (continued)
- [elpa] externals/dash 9faa422 115/426: Add -partition-by, Phillip Lord, 2015/08/04
- [elpa] externals/dash f034c16 119/426: Add -union (thanks to @Fuco1), Phillip Lord, 2015/08/04
- [elpa] externals/dash 9a3dfdd 113/426: Name parameter PRED when function expects predicate., Phillip Lord, 2015/08/04
- [elpa] externals/dash cca9b1b 121/426: Also run tests on Emacs24, Phillip Lord, 2015/08/04
- [elpa] externals/dash c669282 123/426: Add @Fuco1 to list of contributors., Phillip Lord, 2015/08/04
- [elpa] externals/dash 12ed9f6 100/426: Add destructive operations !cons og !cdr, Phillip Lord, 2015/08/04
- [elpa] externals/dash c025efb 122/426: Add -separate (thanks @Fuco1), Phillip Lord, 2015/08/04
- [elpa] externals/dash 2c5b86e 117/426: Add -join as alias to -distinct., Phillip Lord, 2015/08/04
- [elpa] externals/dash 1c4e5d7 125/426: Remove eval from --reduce, it is evil., Phillip Lord, 2015/08/04
- [elpa] externals/dash 8f91ec8 126/426: 1.0.2, Phillip Lord, 2015/08/04
- [elpa] externals/dash 1120417 127/426: Add -group-by,
Phillip Lord <=
- [elpa] externals/dash 5e72ff9 120/426: Include numbers in github ids., Phillip Lord, 2015/08/04
- [elpa] externals/dash a23aa4b 128/426: Add examples for -group-by, Phillip Lord, 2015/08/04
- [elpa] externals/dash 7f7ac33 130/426: Add Takafumi Arakaki to list of contributors., Phillip Lord, 2015/08/04
- [elpa] externals/dash 3044e83 129/426: Merge pull request #8 from tkf/group-by, Phillip Lord, 2015/08/04
- [elpa] externals/dash 85bd4e0 131/426: Add @tali713's -applify, Phillip Lord, 2015/08/04
- [elpa] externals/dash e9de223 116/426: Rename -replace-where to -map-when, Phillip Lord, 2015/08/04
- [elpa] externals/dash 002e4cd 132/426: Add tali713 to list of contributors., Phillip Lord, 2015/08/04
- [elpa] externals/dash 7e4ee06 135/426: 1.0.3, Phillip Lord, 2015/08/04
- [elpa] externals/dash e4521af 136/426: Add -repeat, Phillip Lord, 2015/08/04
- [elpa] externals/dash 69e054e 124/426: Switch around order of Contribute and Contributors parts in readme., Phillip Lord, 2015/08/04