diff --git a/guix/utils.scm b/guix/utils.scm index f161cb4ef3..2740552a75 100644 --- a/guix/utils.scm +++ b/guix/utils.scm @@ -139,6 +139,9 @@ (define-module (guix utils) with-environment-variables arguments-from-environment-variable + flatten + flat-map + config-directory cache-directory @@ -1028,6 +1031,29 @@ (define (with-atomic-file-output file proc) (false-if-exception (delete-file template)) (close-port out))))) +;; TODO: bring over other utility procedures from (haunt utils). +(define* (flatten lst #:optional depth) + "Return a list that recursively concatenates the sub-lists of LST, +up to DEPTH levels deep. When DEPTH is #f, the entire tree is +flattened." + (if (and (number? depth) (zero? depth)) + lst + (fold-right (match-lambda* + (((sub-list ...) memo) + (append (flatten sub-list (and depth (1- depth))) + memo)) + ((elem memo) + (cons elem memo))) + '() + lst))) + +(define (flat-map proc . lsts) + "Apply PROC to each element of each list in LSTS and return a new +list in which nested lists are concatenated into the result. + +For example, the list (1 2 (3)) would be flattened to (1 2 3)." + (flatten (apply map proc lsts) 1)) + (define* (xdg-directory variable suffix #:key (ensure? #t)) "Return the name of the XDG directory that matches VARIABLE and SUFFIX, after making sure that it exists if ENSURE? is true. VARIABLE is an