aboutsummaryrefslogtreecommitdiff
path: root/compat-30.el
diff options
context:
space:
mode:
authorDaniel Mendler <mail@daniel-mendler.de>2024-02-02 15:56:43 +0100
committerDaniel Mendler <mail@daniel-mendler.de>2024-02-02 16:01:17 +0100
commit31899a2a4d04335512a52f120087f699c00da693 (patch)
tree71d8730d31e7bd54bca0a77116939c6cea3d411e /compat-30.el
parent980f58d26f3655863e35b7284c4df0513fa35f88 (diff)
compat-30: Add sort-on
Diffstat (limited to 'compat-30.el')
-rw-r--r--compat-30.el21
1 files changed, 21 insertions, 0 deletions
diff --git a/compat-30.el b/compat-30.el
index cd9ad76..a831c4e 100644
--- a/compat-30.el
+++ b/compat-30.el
@@ -27,6 +27,27 @@
;; TODO Update to 30.1 as soon as the Emacs emacs-30 branch version bumped
(compat-version "30.0.50")
+;;;; Defined in sort.el
+
+(compat-defun sort-on (sequence predicate accessor) ;; <compat-tests:sort-on>
+ "Sort SEQUENCE by calling PREDICATE on sort keys produced by ACCESSOR.
+SEQUENCE should be the input list to sort.
+Elements of SEQUENCE are sorted by keys which are obtained by
+calling ACCESSOR on each element. ACCESSOR should be a function of
+one argument, an element of SEQUENCE, and should return the key
+value to be compared by PREDICATE for sorting the element.
+PREDICATE is the function for comparing keys; it is called with two
+arguments, the keys to compare, and should return non-nil if the
+first key should sort before the second key.
+This function has the performance advantage of evaluating
+ACCESSOR only once for each element in the input SEQUENCE, and is
+therefore appropriate when computing the key by ACCESSOR is an
+expensive operation. This is known as the \"decorate-sort-undecorate\"
+paradigm, or the Schwartzian transform."
+ (mapcar #'car
+ (sort (mapcar #'(lambda (x) (cons x (funcall accessor x))) sequence)
+ #'(lambda (x y) (funcall predicate (cdr x) (cdr y))))))
+
;;;; Defined in buffer.c
(compat-defun find-buffer (variable value) ;; <compat-tests:find-buffer>