aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2019-05-18 12:34:37 +0100
committerChristopher Baines <mail@cbaines.net>2019-05-18 12:34:37 +0100
commit5124fbc471e860120f0ca1aa6cef7b50b03c0ece (patch)
tree2654292272c32d863f2a6dee7bcc3fca5bbbdf56
parent48070e4a9952a57eb03a56199ccb5193e0d99055 (diff)
downloaddata-service-5124fbc471e860120f0ca1aa6cef7b50b03c0ece.tar
data-service-5124fbc471e860120f0ca1aa6cef7b50b03c0ece.tar.gz
Add a utility to group list values
This is useful for some queries with duplicated parts of the results.
-rw-r--r--guix-data-service/model/utils.scm17
1 files changed, 16 insertions, 1 deletions
diff --git a/guix-data-service/model/utils.scm b/guix-data-service/model/utils.scm
index 94a7276..1ece31a 100644
--- a/guix-data-service/model/utils.scm
+++ b/guix-data-service/model/utils.scm
@@ -1,12 +1,14 @@
(define-module (guix-data-service model utils)
#:use-module (srfi srfi-1)
#:use-module (ice-9 vlist)
+ #:use-module (ice-9 receive)
#:use-module (squee)
#:export (quote-string
value->quoted-string-or-null
exec-query->vhash
two-lists->vhash
- deduplicate-strings))
+ deduplicate-strings
+ group-list-by-first-n-fields))
(define (quote-string s)
(string-append "'" s "'"))
@@ -41,3 +43,16 @@
(cons (first pair) result))))
'()
(sort strings string<?)))
+
+(define (group-list-by-first-n-fields n lists)
+ (fold (lambda (lst groups)
+ (receive (key vals)
+ (split-at lst n)
+ (append
+ (alist-delete key groups)
+ `((,key . ,(append
+ (or (assoc-ref groups key)
+ '())
+ (list vals)))))))
+ '()
+ lists))