Function: cl--delete-duplicates

cl--delete-duplicates is a byte-compiled function defined in cl-seq.el.gz.

Signature

(cl--delete-duplicates SEQ CL-KEYS COPY)

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/cl-seq.el.gz
(defun cl--delete-duplicates (seq cl-keys copy)
  (if (listp seq)
      (cl--parsing-keywords
          ;; We need to parse :if, otherwise `cl-if' is unbound.
          (:test :test-not :key (:start 0) :end :from-end :if)
	  ()
	(if cl-from-end
            (let ((p (nthcdr cl-start seq)) i)
              (setq cl-end (- (or cl-end (length seq)) cl-start))
	      (while (> cl-end 1)
                (setq i 0)
                (while (setq i (cl--position (cl--check-key (car p))
                                             (cdr p) i (1- cl-end)))
                  (if copy (setq seq (copy-sequence seq)
                                 p (nthcdr cl-start seq) copy nil))
                  (let ((tail (nthcdr i p)))
                    (setcdr tail (cdr (cdr tail))))
		  (setq cl-end (1- cl-end)))
                (setq p (cdr p) cl-end (1- cl-end)
		      cl-start (1+ cl-start)))
              seq)
          (setq cl-end (- (or cl-end (length seq)) cl-start))
          (while (and (cdr seq) (= cl-start 0) (> cl-end 1)
                      (cl--position (cl--check-key (car seq))
                                    (cdr seq) 0 (1- cl-end)))
            (setq seq (cdr seq) cl-end (1- cl-end)))
          (let ((p (if (> cl-start 0) (nthcdr (1- cl-start) seq)
                     (setq cl-end (1- cl-end) cl-start 1) seq)))
            (while (and (cdr (cdr p)) (> cl-end 1))
              (if (cl--position (cl--check-key (car (cdr p)))
                                (cdr (cdr p)) 0 (1- cl-end))
		  (progn
                    (if copy (setq seq (copy-sequence seq)
                                   p (nthcdr (1- cl-start) seq)
                                   copy nil))
                    (setcdr p (cdr (cdr p))))
                (setq p (cdr p)))
	      (setq cl-end (1- cl-end) cl-start (1+ cl-start)))
            seq)))
    (let ((res (cl--delete-duplicates (append seq nil) cl-keys nil)))
      (if (stringp seq) (concat res) (vconcat res)))))