(defun cl-nintersection (cl-list1 cl-list2 &rest cl-keys)
"Combine LIST1 and LIST2 using a set-intersection operation.
The resulting list contains all items that appear in both LIST1 and LIST2.
-This is a destructive function; it reuses the storage of LIST1 and LIST2
-whenever possible.
+This is a destructive function; it reuses the storage of LIST1 (but not
+LIST2) whenever possible.
\nKeywords supported: :test :test-not :key
\n(fn LIST1 LIST2 [KEYWORD VALUE]...)"
(and cl-list1 cl-list2 (apply 'cl-intersection cl-list1 cl-list2 cl-keys)))
(defun cl-nset-difference (cl-list1 cl-list2 &rest cl-keys)
"Combine LIST1 and LIST2 using a set-difference operation.
The resulting list contains all items that appear in LIST1 but not LIST2.
-This is a destructive function; it reuses the storage of LIST1 and LIST2
-whenever possible.
+This is a destructive function; it reuses the storage of LIST1 (but not
+LIST2) whenever possible.
\nKeywords supported: :test :test-not :key
\n(fn LIST1 LIST2 [KEYWORD VALUE]...)"
(if (or (null cl-list1) (null cl-list2)) cl-list1
(ert-deftest cl-nintersection-test ()
(should-not (cl-nintersection () ()))
- (should-not (cl-nintersection () (list 1 2 3)))
- (should-not (cl-nintersection (list 1 2) (list 3 4)))
- (should (equal (cl-nintersection (list 1 2 3 4) (list 3 4 5 6))
+ (should-not (cl-nintersection () '(1 2 3)))
+ (should-not (cl-nintersection (list 1 2) '(3 4)))
+ (should (equal (cl-nintersection (list 1 2 3 4) '(3 4 5 6))
'(4 3)))
- (should (equal (cl-nintersection (list 1 2 3) (list 1 2 3))
+ (should (equal (cl-nintersection (list 1 2 3) '(1 2 3))
'(1 2 3)))
- (should (equal (cl-nintersection (list 1 1 2 2 3) (list 2 2 3 4))
+ (should (equal (cl-nintersection (list 1 1 2 2 3) '(2 2 3 4))
'(3 2 2)))
(should (equal (cl-nintersection (list 1 (copy-sequence "two") 3)
- (list 3 "two" 4))
+ '(3 "two" 4))
'(3)))
- (should (equal (cl-nintersection (list 1 2 3) (list 3 2 1) :test #'equal)
+ (should (equal (cl-nintersection (list 1 2 3) '(3 2 1) :test #'equal)
'(1 2 3))))
(ert-deftest cl-set-difference-test ()
(ert-deftest cl-nset-difference ()
;; Our nset-difference doesn't preserve order.
- (let* ((l1 (list 1 2 3 4)) (l2 '(3 4 5 6))
+ (let* ((l1 (list 1 2 3 4)) (l2 (list 3 4 5 6))
(diff (cl-nset-difference l1 l2)))
(should (memq 1 diff))
(should (memq 2 diff))
- (should (= (length diff) 2))
+ (should (length= diff 2))
(should (equal l2 '(3 4 5 6))))
- (let* ((l1 (list "1" "2" "3" "4")) (l2 '("3" "4" "5" "6"))
+ (let* ((l1 (list "1" "2" "3" "4")) (l2 (list "3" "4" "5" "6"))
(diff (cl-nset-difference l1 l2 :test #'equal)))
(should (member "1" diff))
(should (member "2" diff))
- (should (= (length diff) 2))
+ (should (length= diff 2))
(should (equal l2 '("3" "4" "5" "6"))))
(let* ((l1 (list '(a . 1) '(b . 2) '(c . 3) '(d . 4)))
(l2 (list '(c . 3) '(d . 4) '(e . 5) '(f . 6)))
(diff (cl-nset-difference l1 l2 :key #'car)))
(should (member '(a . 1) diff))
(should (member '(b . 2) diff))
- (should (= (length diff) 2)))
+ (should (length= diff 2))
+ (should (equal l2 '((c . 3) (d . 4) (e . 5) (f . 6)))))
(let* ((l1 (list '("a" . 1) '("b" . 2) '("c" . 3) '("d" . 4)))
(l2 (list '("c" . 3) '("d" . 4) '("e" . 5) '("f" . 6)))
(diff (cl-nset-difference l1 l2 :key #'car :test #'string=)))
(should (member '("a" . 1) diff))
(should (member '("b" . 2) diff))
- (should (= (length diff) 2))))
+ (should (length= diff 2))
+ (should (equal l2 '(("c" . 3) ("d" . 4) ("e" . 5) ("f" . 6))))))
(ert-deftest cl-nset-difference-test ()
(should-not (cl-nset-difference () ()))
(should-not (cl-nset-difference () (list 1 2 3)))
- (should-not (cl-nset-difference (list 1 2 3) (list 1 2 3)))
- (should-not (cl-nset-difference (list 1 2 3) (list 3 2 1) :test #'equal))
+ (should-not (cl-nset-difference (list 1 2 3) '(1 2 3)))
+ (should-not (cl-nset-difference (list 1 2 3) '(3 2 1) :test #'equal))
(should (equal (cl-nset-difference (list 1 2 3) ())
'(1 2 3)))
- (should (equal (cl-nset-difference (list 1 2 3 4) (list 3 4 5 6))
+ (should (equal (cl-nset-difference (list 1 2 3 4) '(3 4 5 6))
'(1 2)))
- (should (equal (cl-nset-difference (list 1 1 2 2 3) (list 3 4 5))
+ (should (equal (cl-nset-difference (list 1 1 2 2 3) '(3 4 5))
'(1 1 2 2)))
- (should (equal (cl-nset-difference (list 1 2 3) (list 3 2 4))
+ (should (equal (cl-nset-difference (list 1 2 3) '(3 2 4))
'(1)))
- (should (equal (cl-nset-difference (list 1 2 3 4 5) (list 3 4 5 6 7))
+ (should (equal (cl-nset-difference (list 1 2 3 4 5) '(3 4 5 6 7))
'(1 2)))
- (should (equal (cl-nset-difference (list 1 (copy-sequence "a")) (list 1 "a"))
+ (should (equal (cl-nset-difference (list 1 (copy-sequence "a")) '(1 "a"))
'("a"))))
(ert-deftest cl-set-exclusive-or-test ()