M guix/records.scm => guix/records.scm +13 -3
@@ 198,9 198,19 @@ thunked fields."
#'((field options ...)
...))))))))))
-(define (alist->record alist make keys)
- "Apply MAKE to the values associated with KEYS in ALIST."
- (let ((args (map (cut assoc-ref alist <>) keys)))
+(define* (alist->record alist make keys
+ #:optional (multiple-value-keys '()))
+ "Apply MAKE to the values associated with KEYS in ALIST. Items in KEYS that
+are also in MULTIPLE-VALUE-KEYS are considered to occur possibly multiple
+times in ALIST, and thus their value is a list."
+ (let ((args (map (lambda (key)
+ (if (member key multiple-value-keys)
+ (filter-map (match-lambda
+ ((k . v)
+ (and (equal? k key) v)))
+ alist)
+ (assoc-ref alist key)))
+ keys)))
(apply make args)))
(define (object->fields object fields port)
M tests/records.scm => tests/records.scm +6 -0
@@ 158,6 158,12 @@ Version: 1.5
(list (recutils->alist p)
(recutils->alist p))))
+(test-equal "alist->record" '((1 2) b c)
+ (alist->record '(("a" . 1) ("b" . b) ("c" . c) ("a" . 2))
+ list
+ '("a" "b" "c")
+ '("a")))
+
(test-end)