mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2025-01-12 14:16:55 -05:00
discovery: Add 'fold-module-public-variables*'.
* guix/discovery.scm (fold-module-public-variables*): New procedure.
This commit is contained in:
parent
ae92782240
commit
1d90e9d7c9
1 changed files with 26 additions and 2 deletions
|
@ -1,5 +1,5 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -30,7 +30,8 @@ (define-module (guix discovery)
|
||||||
scheme-modules*
|
scheme-modules*
|
||||||
fold-modules
|
fold-modules
|
||||||
all-modules
|
all-modules
|
||||||
fold-module-public-variables))
|
fold-module-public-variables
|
||||||
|
fold-module-public-variables*))
|
||||||
|
|
||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
;;;
|
;;;
|
||||||
|
@ -147,10 +148,33 @@ (define* (all-modules path #:key (warn (const #f)))
|
||||||
SUB-DIRECTORY."
|
SUB-DIRECTORY."
|
||||||
(fold-modules cons '() path #:warn warn))
|
(fold-modules cons '() path #:warn warn))
|
||||||
|
|
||||||
|
(define (fold-module-public-variables* proc init modules)
|
||||||
|
"Call (PROC MODULE SYMBOL VARIABLE) for each variable exported by one of MODULES,
|
||||||
|
using INIT as the initial value of RESULT. It is guaranteed to never traverse
|
||||||
|
the same object twice."
|
||||||
|
;; Here SEEN is populated by variables; if two different variables refer to
|
||||||
|
;; the same object, we still let them through.
|
||||||
|
(identity ;discard second return value
|
||||||
|
(fold2 (lambda (module result seen)
|
||||||
|
(fold2 (lambda (sym+var result seen)
|
||||||
|
(match sym+var
|
||||||
|
((sym . var)
|
||||||
|
(if (not (vhash-assq var seen))
|
||||||
|
(values (proc module sym var result)
|
||||||
|
(vhash-consq var #t seen))
|
||||||
|
(values result seen)))))
|
||||||
|
result
|
||||||
|
seen
|
||||||
|
(module-map cons module)))
|
||||||
|
init
|
||||||
|
vlist-null
|
||||||
|
modules)))
|
||||||
|
|
||||||
(define (fold-module-public-variables proc init modules)
|
(define (fold-module-public-variables proc init modules)
|
||||||
"Call (PROC OBJECT RESULT) for each variable exported by one of MODULES,
|
"Call (PROC OBJECT RESULT) for each variable exported by one of MODULES,
|
||||||
using INIT as the initial value of RESULT. It is guaranteed to never traverse
|
using INIT as the initial value of RESULT. It is guaranteed to never traverse
|
||||||
the same object twice."
|
the same object twice."
|
||||||
|
;; Note: here SEEN is populated by objects, not by variables.
|
||||||
(identity ; discard second return value
|
(identity ; discard second return value
|
||||||
(fold2 (lambda (module result seen)
|
(fold2 (lambda (module result seen)
|
||||||
(fold2 (lambda (var result seen)
|
(fold2 (lambda (var result seen)
|
||||||
|
|
Loading…
Reference in a new issue