guix-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug#74654] [PATCH 2/5] packages: Optimize ‘all-packages’.


From: Simon Tournier
Subject: [bug#74654] [PATCH 2/5] packages: Optimize ‘all-packages’.
Date: Tue, 10 Dec 2024 15:05:57 +0100

Hi,

On Mon, 02 Dec 2024 at 17:53, Ludovic Courtès <ludo@gnu.org> wrote:

> -    (delete-duplicates
> -     (fold-packages (lambda (package result)
> -                      (match (package-replacement package)
> -                        ((? package? replacement)
> -                         (cons* replacement package result))
> -                        (#f
> -                         (cons package result))))
> -                    '()
> +    ;; Note: 'fold-packages' never traverses the same package twice but
> +    ;; replacements break that (they may or may not be visible to
> +    ;; 'fold-packages'), hence this hash table to track visited packages.
> +    (define visited (make-hash-table))
>  
> -                    ;; Dismiss deprecated packages but keep hidden packages.
> -                    #:select? (negate package-superseded))
> -     eq?)))
> +    (fold-packages (lambda (package result)
> +                     (if (hashq-ref visited package)
> +                         result
> +                         (begin
> +                           (hashq-set! visited package #t)
> +                           (match (package-replacement package)
> +                             ((? package? replacement)
> +                              (hashq-set! visited replacement #t)
> +                              (cons* replacement package result))
> +                             (#f
> +                              (cons package result))))))
> +                   '()
> +
> +                   ;; Dismiss deprecated packages but keep hidden packages.
> +                   #:select? (negate package-superseded))))

Oh!  This is a better implementation, indeed. :-)

LGTM.

Cheers,
simon





reply via email to

[Prev in Thread] Current Thread [Next in Thread]