Function: reftex-uniquify-by-car

reftex-uniquify-by-car is a byte-compiled function defined in reftex.el.gz.

Signature

(reftex-uniquify-by-car ALIST &optional KEEP-LIST SORT)

Source Code

;; Defined in /usr/src/emacs/lisp/textmodes/reftex.el.gz
(defun reftex-uniquify-by-car (alist &optional keep-list sort)
  ;; Return a list of all elements in ALIST, but each car only once.
  ;; Elements of KEEP-LIST are not removed even if duplicate.
  ;; The order is kept unless SORT is set (faster!).
  (setq keep-list (sort (copy-sequence keep-list) #'string<)
	alist (copy-sequence alist))
  (if sort
      (let (lst elt)
	(setq alist (sort alist (lambda(a b) (string< (car a) (car b)))))
	(setq lst alist)
	(while (cdr lst)
	  (setq elt (car (car lst)))
	  (when (string= elt (car (cadr lst)))
	    (while (and keep-list (string< (car keep-list) elt))
	      (pop keep-list))
	    (if (and keep-list (string= elt (car keep-list)))
		(progn
		  (pop lst)
		  (while (and (cdr lst)
			      (string= elt (car (cadr lst))))
		    (pop lst)))
	      (setcdr lst (cdr (cdr lst)))
	      (while (and (cdr lst)
			  (string= elt (car (cadr lst))))
		(setcdr lst (cdr (cdr lst))))))
	  (pop lst))
	alist)
    (let ((p alist) lst elt)
      (while p
	(push p lst)
	(setq p (cdr p)))
      (setq lst (sort lst (lambda(a b) (string< (car (car a))
						(car (car b))))))
      (while (cdr lst)
	(setq elt (car (car (car lst))))
	(when (string= elt (car (car (cadr lst))))
	  (while (and keep-list (string< (car keep-list) elt))
	    (pop keep-list))
	  (if (and keep-list (string= elt (car keep-list)))
	      (progn
		(pop lst)
		(while (and (cdr lst)
			    (string= elt (car (car (cadr lst)))))
		  (pop lst)))
	    (setcar (pop lst) nil)
	    (while (and (cdr lst)
			(string= elt (car (car (cadr lst)))))
	      (setcar (pop lst) nil))))
	(pop lst)))
    (delq nil alist)))