summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/home-services/configuration.scm2
-rw-r--r--gnu/home-services/utils.scm30
-rw-r--r--gnu/home-services/xdg.scm12
-rw-r--r--guix/scripts/home/import.scm4
4 files changed, 42 insertions, 6 deletions
diff --git a/gnu/home-services/configuration.scm b/gnu/home-services/configuration.scm
index 3698006c37..e8f4bc77ec 100644
--- a/gnu/home-services/configuration.scm
+++ b/gnu/home-services/configuration.scm
@@ -23,6 +23,8 @@
#:use-module (srfi srfi-1)
#:use-module (ice-9 curried-definitions)
#:use-module (ice-9 match)
+ #:use-module (guix i18n)
+ #:use-module (guix diagnostics)
#:export (filter-configuration-fields
diff --git a/gnu/home-services/utils.scm b/gnu/home-services/utils.scm
index 3e490a0515..f13133a7ae 100644
--- a/gnu/home-services/utils.scm
+++ b/gnu/home-services/utils.scm
@@ -24,7 +24,8 @@
#:export (maybe-object->string
object->snake-case-string
- object->camel-case-string))
+ object->camel-case-string
+ list->human-readable-list))
(define (maybe-object->string object)
"Like @code{object->string} but don't do anyting if OBJECT already is
@@ -75,3 +76,30 @@ STYLE can be three `@code{lower}', `@code{upper}', defaults to
(cons (first splitted-string)
(map string-capitalize
(cdr splitted-string))))))))))
+
+(define* (list->human-readable-list lst
+ #:key
+ (cumulative? #f)
+ (proc identity))
+ "Turn a list LST into a sequence of terms readable by humans.
+If CUMULATIVE? is @code{#t}, use ``and'', otherwise use ``or'' before
+the last term.
+
+PROC is a procedure to apply to each of the elements of a list before
+turning them into a single human readable string.
+
+@example
+(list->human-readable-list '(1 4 9) #:cumulative? #t #:proc sqrt)
+@result{} \"1, 2, and 3\"
+@end example
+
+yields:"
+ (let* ((word (if cumulative? "and " "or "))
+ (init (append (drop-right lst 1))))
+ (format #f "~a" (string-append
+ (string-join
+ (map (compose maybe-object->string proc) init)
+ ", " 'suffix)
+ word
+ (maybe-object->string (proc (last lst)))))))
+
diff --git a/gnu/home-services/xdg.scm b/gnu/home-services/xdg.scm
index 457ce999a1..94275f3b65 100644
--- a/gnu/home-services/xdg.scm
+++ b/gnu/home-services/xdg.scm
@@ -287,9 +287,9 @@ The value of an XDG MIME entry must be a list, string or symbol, was given ~a")
@example
(merge-duplicates '((key1 . value1)
- (key2 . value2)
- (key1 . value3)
- (key1 . value4)) '())
+ (key2 . value2)
+ (key1 . value3)
+ (key1 . value4)) '())
@result{} ((key1 . (value4 value3 value1)) (key2 . value2))
@end example"
@@ -299,14 +299,16 @@ The value of an XDG MIME entry must be a list, string or symbol, was given ~a")
(tail (cdr alist))
(key (first head))
(value (cdr head))
- (duplicate? (assoc key acc)))
+ (duplicate? (assoc key acc))
+ (ensure-list (lambda (x)
+ (if (list? x) x (list x)))))
(if duplicate?
;; XXX: This will change the order of things,
;; though, it shouldn't be a problem for XDG MIME.
(merge-duplicates
tail
(alist-cons key
- (cons value (maybe-list (cdr duplicate?)))
+ (cons value (ensure-list (cdr duplicate?)))
(alist-delete key acc)))
(merge-duplicates tail (cons head acc)))))))
diff --git a/guix/scripts/home/import.scm b/guix/scripts/home/import.scm
index 39f45dbeac..79fb23a2fd 100644
--- a/guix/scripts/home/import.scm
+++ b/guix/scripts/home/import.scm
@@ -20,9 +20,13 @@
(define-module (guix scripts home import)
#:use-module (guix profiles)
#:use-module (guix ui)
+ #:use-module (guix utils)
+ #:use-module (guix packages)
+ #:use-module (gnu packages)
#:use-module (ice-9 match)
#:use-module (ice-9 pretty-print)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-26)
#:export (import-manifest))
;;; Commentary: