~ruther/guix-local

c8772a7a21f954b5e75746529e70edc3a1017249 — Ludovic Courtès 12 years ago b7b8828
records: `alist->record' supports multiple-field occurrences.

* guix/records.scm (alist->record): Add `multiple-value-keys'
  parameter.  Update docstring, and honor it.
* tests/records.scm ("alist->record"): New record.
2 files changed, 19 insertions(+), 3 deletions(-)

M guix/records.scm
M tests/records.scm
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)