From efd3ea79905c12e2c1c594fa6b54cf62d741f92f Mon Sep 17 00:00:00 2001 From: Andrew Tropin Date: Tue, 31 Aug 2021 15:40:07 +0300 Subject: [PATCH 2/2] home-services: configuration: Add generic-serialize-alist. * gnu/home-services/configuration.scm (generic-serialize-alist) (generic-serialize-alist-entry): New variables. --- gnu/home-services/configuration.scm | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/gnu/home-services/configuration.scm b/gnu/home-services/configuration.scm index 039877b5c1..3698006c37 100644 --- a/gnu/home-services/configuration.scm +++ b/gnu/home-services/configuration.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2021 Andrew Tropin +;;; Copyright © 2021 Xinglu Chen ;;; ;;; This file is part of GNU Guix. ;;; @@ -20,6 +21,8 @@ #:use-module (gnu services configuration) #:use-module (guix gexp) #:use-module (srfi srfi-1) + #:use-module (ice-9 curried-definitions) + #:use-module (ice-9 match) #:export (filter-configuration-fields @@ -31,7 +34,9 @@ string-or-gexp? serialize-string-or-gexp text-config? - serialize-text-config)) + serialize-text-config + generic-serialize-alist-entry + generic-serialize-alist)) (define* (filter-configuration-fields configuration-fields fields #:optional negate?) @@ -79,3 +84,24 @@ the list result in @code{#t} when applying PRED? on them." (and (list? config) (every string-or-gexp? config))) (define (serialize-text-config field-name val) #~(string-append #$@(interpose val "\n" 'suffix))) + +(define ((generic-serialize-alist-entry serialize-field) entry) + "Apply the SERIALIZE-FIELD procedure on the field and value of ENTRY." + (match entry + ((field . val) (serialize-field field val)))) + +(define (generic-serialize-alist combine serialize-field fields) + "Generate a configuration from an association list FIELDS. + +SERIALIZE-FIELD is a procedure that takes two arguments, it will be +applied on the fields and values of FIELDS using the +@code{generic-serialize-alist-entry} procedure. + +COMBINE is a procedure that takes one or more arguments and combines +all the alist entries into one value, @code{string-append} or +@code{append} are usually good candidates for this. + +See the @code{serialize-alist} procedure in `@code{(gnu home-services +version-control}' for an example usage.)}" + (apply combine + (map (generic-serialize-alist-entry serialize-field) fields))) -- 2.33.0