[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 2946344: New function seq-sort-by in seq.el
From: |
Nicolas Petton |
Subject: |
[Emacs-diffs] master 2946344: New function seq-sort-by in seq.el |
Date: |
Tue, 29 Mar 2016 07:20:31 +0000 |
branch: master
commit 2946344a231a915d5143017b70e91a9a7a9b11aa
Author: Nicolas Petton <address@hidden>
Commit: Nicolas Petton <address@hidden>
New function seq-sort-by in seq.el
* lisp/emacs-lisp/seq.el (seq-sort-by): New function.
* test/lisp/emacs-lisp/seq-tests.el: New test for seq-sort-by.
* doc/lispref/sequences.texi: Add documentation for seq-sort-by.
---
doc/lispref/sequences.texi | 12 ++++++++++++
lisp/emacs-lisp/seq.el | 12 +++++++++++-
test/lisp/emacs-lisp/seq-tests.el | 5 +++++
3 files changed, 28 insertions(+), 1 deletions(-)
diff --git a/doc/lispref/sequences.texi b/doc/lispref/sequences.texi
index f7d26e5..08e5e3a 100644
--- a/doc/lispref/sequences.texi
+++ b/doc/lispref/sequences.texi
@@ -763,6 +763,18 @@ according to @var{function}, a function of two arguments
that returns
address@hidden if the first argument should sort before the second.
@end defun
address@hidden seq-sort-by function predicate sequence
+ This function is similar to @code{seq-sort}, but the elements of
address@hidden are transformed by applying @var{function} on them
+before being sorted. @var{function} is a function of one argument.
+
address@hidden
+(seq-sort-by #'seq-length #'> ["a" "ab" "abc"])
address@hidden ["abc" "ab" "a"]
address@hidden example
address@hidden defun
+
+
@defun seq-contains sequence elt &optional function
This function returns the first element in @var{sequence} that is equal to
@var{elt}. If the optional argument @var{function} is address@hidden,
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 8b7b594..89fad43 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -4,7 +4,7 @@
;; Author: Nicolas Petton <address@hidden>
;; Keywords: sequences
-;; Version: 2.3
+;; Version: 2.14
;; Package: seq
;; Maintainer: address@hidden
@@ -218,6 +218,16 @@ The result is a sequence of the same type as SEQUENCE."
(cl-defmethod seq-sort (pred (list list))
(sort (seq-copy list) pred))
+(defun seq-sort-by (function pred sequence)
+ "Sort SEQUENCE using PRED as a comparison function.
+Elements of SEQUENCE are transformed by FUNCTION before being
+sorted. FUNCTION must be a function of one argument."
+ (seq-sort (lambda (a b)
+ (funcall pred
+ (funcall function a)
+ (funcall function b)))
+ sequence))
+
(cl-defgeneric seq-reverse (sequence)
"Return a sequence with elements of SEQUENCE in reverse order."
(let ((result '()))
diff --git a/test/lisp/emacs-lisp/seq-tests.el
b/test/lisp/emacs-lisp/seq-tests.el
index c9219b5..50543de 100644
--- a/test/lisp/emacs-lisp/seq-tests.el
+++ b/test/lisp/emacs-lisp/seq-tests.el
@@ -347,5 +347,10 @@ Evaluate BODY for each created sequence.
(should (= (seq-position seq 'a #'eq) 0))
(should (null (seq-position seq (make-symbol "a") #'eq)))))
+(ert-deftest test-seq-sort-by ()
+ (let ((seq ["x" "xx" "xxx"]))
+ (should (equal (seq-sort-by #'seq-length #'> seq)
+ ["xxx" "xx" "x"]))))
+
(provide 'seq-tests)
;;; seq-tests.el ends here
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master 2946344: New function seq-sort-by in seq.el,
Nicolas Petton <=