diff --git a/emacs/guix-main.scm b/emacs/guix-main.scm index 925d2b2b40..c62044056f 100644 --- a/emacs/guix-main.scm +++ b/emacs/guix-main.scm @@ -103,24 +103,34 @@ (define* (make-package-specification name #:optional version output) (define name+version->key cons) (define key->name+version car+cdr) -(define %packages - (fold-packages (lambda (pkg res) - (vhash-consq (object-address pkg) pkg res)) - vlist-null)) +(define %package-vhash + (delay + (fold-packages (lambda (pkg res) + (vhash-consq (object-address pkg) pkg res)) + vlist-null))) + +(define (package-vhash) + "Return vhash of 'package ID (address)'/'package' pairs." + (force %package-vhash)) (define %package-table - (let ((table (make-hash-table (vlist-length %packages)))) - (vlist-for-each - (lambda (elem) - (match elem - ((address . pkg) - (let* ((key (name+version->key (package-name pkg) - (package-version pkg))) - (ref (hash-ref table key))) - (hash-set! table key - (if ref (cons pkg ref) (list pkg))))))) - %packages) - table)) + (delay + (let ((table (make-hash-table (vlist-length (package-vhash))))) + (vlist-for-each + (lambda (elem) + (match elem + ((address . pkg) + (let* ((key (name+version->key (package-name pkg) + (package-version pkg))) + (ref (hash-ref table key))) + (hash-set! table key + (if ref (cons pkg ref) (list pkg))))))) + (package-vhash)) + table))) + +(define (package-table) + "Return hash table of 'name+version key'/'list of packages' pairs." + (force %package-table)) (define (manifest-entry->name+version+output entry) (values @@ -330,12 +340,12 @@ (define (package-param package param) ;;; Finding packages. (define (package-by-address address) - (match (vhash-assq address %packages) + (match (vhash-assq address (package-vhash)) ((_ . package) package) (_ #f))) (define (packages-by-name+version name version) - (or (hash-ref %package-table + (or (hash-ref (package-table) (name+version->key name version)) '()))