diff --git a/guix/ui.scm b/guix/ui.scm index 7920335928..0e60eb6edc 100644 --- a/guix/ui.scm +++ b/guix/ui.scm @@ -1291,23 +1291,36 @@ score, the more relevant OBJ is to REGEXPS." 5 ;exact match 1))))) regexps)) - + scores) + + (define (update relevance weight scores) + (map + relevance + (map (lambda (score) + (* weight score)) + scores))) + + (let ((scores (fold (lambda (metric relevance) + (match metric + ((field . weight) + (match (field obj) + (#f relevance) + ((? string? str) + (update relevance weight (score str))) + ((lst ...) + (update relevance weight + (fold (lambda (elem prev) + (if (zero? (length elem)) + prev + (map + elem prev))) + (make-list (length regexps) 0) + (map score lst))) + ))))) + (make-list (length regexps) 0) + metrics))) ;; Return zero if one of REGEXPS doesn't match. (if (any zero? scores) 0 - (reduce + 0 scores))) - - (fold (lambda (metric relevance) - (match metric - ((field . weight) - (match (field obj) - (#f relevance) - ((? string? str) - (+ relevance (* (score str) weight))) - ((lst ...) - (+ relevance (* weight (apply + (map score lst))))))))) - 0 - metrics)) + (reduce + 0 scores)))) (define %package-metrics ;; Metrics used to compute the "relevance score" of a package against a set