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

From: Simon Tournier <[email-masked]>
Date: Tue, 10 Dec 2024 15:05:57 +0100

Hi,

On Mon, 02 Dec 2024 at 17:53, Ludovic Courtès <[email-masked]> 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