[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#68271] [PATCH 1/3] guix: utils: Add delete-duplicates/sort.
From: |
Christopher Baines |
Subject: |
[bug#68271] [PATCH 1/3] guix: utils: Add delete-duplicates/sort. |
Date: |
Fri, 5 Jan 2024 20:53:20 +0000 |
Similar to delete-duplicates, but sorts the list first and then compares the
pairs in the list. This is faster than delete-duplicates for larger lists.
* guix/utils.scm (delete-duplicates): New procedure.
Change-Id: Ibc2897cdb7c76be0d0e099bc47fee005a88bea2e
---
guix/utils.scm | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/guix/utils.scm b/guix/utils.scm
index e4e9d922e7..c1c967ee6c 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -146,6 +146,8 @@ (define-module (guix utils)
edit-expression
delete-expression
+ delete-duplicates/sort
+
filtered-port
decompressed-port
call-with-decompressed-port
@@ -502,6 +504,32 @@ (define (delete-expression source-properties)
"Delete the expression specified by SOURCE-PROPERTIES."
(edit-expression source-properties (const "") #:include-trailing-newline?
#t))
+
+;;;
+;;; Lists.
+;;;
+
+(define* (delete-duplicates/sort unsorted-lst less #:optional (equal? eq?))
+ (if (null? unsorted-lst)
+ unsorted-lst
+ (let ((sorted-lst (sort unsorted-lst
+ ;; Sort in the reverse order
+ (lambda (a b) (eq? #f (less a b))))))
+ (let loop ((lst (cdr sorted-lst))
+ (last-element (car sorted-lst))
+ (result (list (car sorted-lst))))
+ (if (null? lst)
+ result
+ (let ((current-element (car lst)))
+ (if (equal? current-element last-element)
+ (loop (cdr lst)
+ last-element
+ result)
+ (loop (cdr lst)
+ current-element
+ (cons current-element
+ result)))))))))
+
;;;
;;; Keyword arguments.
base-commit: deeb7d1f53d7ddfa977b3eadd760312bbd0a2509
--
2.41.0