Improve delete-consecutive-dups doc precision and add test

* lisp/subr.el (delete-consecutive-dups): Document which element of
each run is retained (the earliest in the list).  This matters because
it makes it safe to ignore the return value.
* test/lisp/subr-tests.el (subr--delete-dups)
(subr--delete-consecutive-dups): Add tests.
This commit is contained in:
Mattias Engdegård 2023-02-26 14:34:58 +01:00
parent c640dc9ef5
commit 434ab2e088
2 changed files with 37 additions and 1 deletions

View file

@ -768,7 +768,9 @@ one is kept. See `seq-uniq' for non-destructive operation."
(defun delete-consecutive-dups (list &optional circular)
"Destructively remove `equal' consecutive duplicates from LIST.
First and last elements are considered consecutive if CIRCULAR is
non-nil."
non-nil.
Of several consecutive `equal' occurrences, the one earliest in
the list is kept."
(let ((tail list) last)
(while (cdr tail)
(if (equal (car tail) (cadr tail))

View file

@ -1171,5 +1171,39 @@ final or penultimate step during initialization."))
(should-not (list-of-strings-p '("a" nil "b")))
(should-not (list-of-strings-p '("a" "b" . "c"))))
(ert-deftest subr--delete-dups ()
(should (equal (delete-dups nil) nil))
(let* ((a (list "a" "b" "c"))
(a-dedup (delete-dups a)))
(should (equal a-dedup '("a" "b" "c")))
(should (eq a a-dedup)))
(let* ((a (list "a" "a" "b" "b" "a" "c" "b" "c" "a"))
(a-b (cddr a)) ; link of first "b"
(a-dedup (delete-dups a)))
(should (equal a-dedup '("a" "b" "c")))
(should (eq a a-dedup))
(should (eq (cdr a-dedup) a-b))))
(ert-deftest subr--delete-consecutive-dups ()
(should (equal (delete-consecutive-dups nil) nil))
(let* ((a (list "a" "b" "c"))
(a-dedup (delete-consecutive-dups a)))
(should (equal a-dedup '("a" "b" "c")))
(should (eq a a-dedup)))
(let* ((a (list "a" "a" "b" "a" "a" "b" "b" "b" "c" "c" "a" "a"))
(a-b (nthcdr 3 a)) ; link of third "a"
(a-dedup (delete-consecutive-dups a)))
(should (equal a-dedup '("a" "b" "a" "b" "c" "a")))
(should (eq a a-dedup))
(should (equal (nthcdr 2 a-dedup) a-b)))
(let* ((a (list "a" "b" "a"))
(a-dedup (delete-consecutive-dups a t)))
(should (equal a-dedup '("a" "b")))
(should (eq a a-dedup)))
(let* ((a (list "a" "a" "b" "a" "a" "b" "b" "b" "c" "c" "a" "a"))
(a-dedup (delete-consecutive-dups a t)))
(should (equal a-dedup '("a" "b" "a" "b" "c")))
(should (eq a a-dedup))))
(provide 'subr-tests)
;;; subr-tests.el ends here