emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/dash 1677338 428/439: Merge pull request #138 from phil


From: Phillip Lord
Subject: [elpa] externals/dash 1677338 428/439: Merge pull request #138 from phillord/fix/group-by-write-out
Date: Tue, 04 Aug 2015 20:31:42 +0000

branch: externals/dash
commit 16773380cac81de04046053efc2753c74a7ef082
Merge: 19fbc24 45bd985
Author: Magnar Sveen <address@hidden>
Commit: Magnar Sveen <address@hidden>

    Merge pull request #138 from phillord/fix/group-by-write-out
    
    Reimplementation of --group-by.
---
 dash.el |   44 +++++++++++++++++++-------------------------
 1 files changed, 19 insertions(+), 25 deletions(-)

diff --git a/dash.el b/dash.el
index fa4057c..9788de6 100644
--- a/dash.el
+++ b/dash.el
@@ -915,31 +915,25 @@ other value (the body)."
 
 (defmacro --group-by (form list)
   "Anaphoric form of `-group-by'."
-  (declare (debug (form form)))
-  (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))))
+  (declare (debug t))
+  (let ((n (make-symbol "n"))
+        (k (make-symbol "k"))
+        (grp (make-symbol "grp")))
+    `(nreverse
+      (-map
+       (lambda (,n)
+         (cons (car ,n)
+               (nreverse (cdr ,n))))
+       (--reduce-from
+        (let* ((,k (,@form))
+               (,grp (assoc ,k acc)))
+          (if ,grp
+              (setcdr ,grp (cons it (cdr ,grp)))
+            (push
+             (list ,k it)
+             acc))
+          acc)
+        nil ,list)))))
 
 (defun -group-by (fn list)
   "Separate LIST into an alist whose keys are FN applied to the



reply via email to

[Prev in Thread] Current Thread [Next in Thread]