]> git.eshelyaron.com Git - emacs.git/commitdiff
(add-to-ordered-list): New defun.
authorKim F. Storm <storm@cua.dk>
Mon, 13 Jun 2005 21:29:52 +0000 (21:29 +0000)
committerKim F. Storm <storm@cua.dk>
Mon, 13 Jun 2005 21:29:52 +0000 (21:29 +0000)
lisp/subr.el

index 9371df1a7942e5ca653a7a848ae70a1d47d2e161..fb48e578157c5629af6724f969b5e2015475b9cb 100644 (file)
@@ -957,6 +957,32 @@ other hooks, such as major mode hooks, can do the job."
             (append (symbol-value list-var) (list element))
           (cons element (symbol-value list-var))))))
 
+
+(defun add-to-ordered-list (list-var element &optional order)
+  "Add to the value of LIST-VAR the element ELEMENT if it isn't there yet.
+The test for presence of ELEMENT is done with `equal'.
+
+The resulting list is reordered so that the elements are in the
+order given by each element's `list-order' property (a number).
+Elements which are not symbols, and symbol elements without a
+numeric `lisp-order' property are placed at the end of the list.
+
+If the third optional argument ORDER is non-nil and ELEMENT is
+a symbol, set the symbol's `list-order' property to the given value.
+
+The return value is the new value of LIST-VAR."
+  (when (and order (symbolp element))
+    (put element 'list-order (and (numberp order) order)))
+  (add-to-list list-var element)
+  (set list-var (sort (symbol-value list-var)
+                     (lambda (a b)
+                       (let ((oa (and (symbolp a) (get a 'list-order)))
+                             (ob (and (symbolp b) (get b 'list-order))))
+                         (cond
+                          ((not oa) nil)
+                          ((not ob) t)
+                          (t (< oa ob))))))))
+
 \f
 ;;; Load history