summary refs log tree commit diff
path: root/gnu/home-services/utils.scm
diff options
context:
space:
mode:
authorAndrew Tropin <andrew@trop.in>2021-09-28 12:30:55 +0300
committerOleg Pykhalov <go.wigust@gmail.com>2021-09-28 13:50:21 +0300
commitbadf788f157a8bffe9fc0695763dc811439dc81b (patch)
treeb1ac9ce8a150d745cbb867bf666848060b03b4e5 /gnu/home-services/utils.scm
parent0c6145e591e9f381b39a8e9b8c1cd023502b390e (diff)
downloadguix-badf788f157a8bffe9fc0695763dc811439dc81b.tar.gz
home-services: Add missing imports and function definition.
* gnu/home-services/configuration.scm: Add missing imports.
* gnu/home-services/utils.scm (list->human-readable-list): Add new function.
* gnu/home-services/configuration.scm: Add missing imports.
* gnu/home-services/xdg.scm: Fix ensure-list function.
* guix/scripts/home/import.scm: Add missing imports.

Signed-off-by: Oleg Pykhalov <go.wigust@gmail.com>
Diffstat (limited to 'gnu/home-services/utils.scm')
-rw-r--r--gnu/home-services/utils.scm30
1 files changed, 29 insertions, 1 deletions
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)))))))
+