branch: externals/ivy commit 738da36d1b61e5b2a38e5775b23edd214ad88d6e Author: Basil L. Contovounesios <ba...@contovou.net> Commit: Basil L. Contovounesios <ba...@contovou.net>
Less consing in ivy--re-filter Avoid repeated cl-remove when matching multiple regexps; unconditionally make a copy and use cl-delete instead. This slightly penalizes the case where no candidates are removed. Using cl-remove for the first pass and subsequently switching to cl-delete would not always work, since it's unknown whether and when cl-remove returns a full or partial copy of its input list. Yet another option would be to consolidate all regexps AOT, in the hope that regexp backtracking in C is faster than looping in Lisp, but that would involve more work both for the programmer and in terms of consing. I'm also not certain about the Ivy semantics for numbered match groups, for matches that are kept. * ivy.el (ivy--re-filter): Replace potentially repeated cl-remove with unconditional copy-sequence followed by cl-delete. This produces less garbage in pathological cases. --- ivy.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ivy.el b/ivy.el index db41371913..446f57e77d 100644 --- a/ivy.el +++ b/ivy.el @@ -3604,8 +3604,8 @@ In any Ivy completion session, the case folding starts with RE is a list of cons cells, with a regexp car and a boolean cdr. When the cdr is t, the car must match. Otherwise, the car must not match." - (if (equal re "") - candidates + (unless (member re '("" ())) + (setq candidates (copy-sequence candidates)) (ignore-errors (dolist (re (if (stringp re) (list (cons re t)) re)) (let* ((re-str (car re)) @@ -3614,10 +3614,10 @@ Otherwise, the car must not match." (funcall mkpred re-str) (lambda (x) (string-match-p re-str x))))) (setq candidates - (cl-remove nil candidates + (cl-delete nil candidates (if (cdr re) :if-not :if) - pred)))) - candidates))) + pred)))))) + candidates) (defun ivy--filter (name candidates) "Return all items that match NAME in CANDIDATES.