From 50538c125895c58005dc79a6a9ef5acc790cbc47 Mon Sep 17 00:00:00 2001 From: David Nolen Date: Wed, 30 Sep 2026 17:08:21 -0400 Subject: [PATCH] switch select-keys to use transients - add test from Clojure commit 8bf60941 --- src/main/cljs/cljs/core.cljs | 20 ++++++++++---------- src/test/cljs/cljs/core_test.cljs | 6 ++++++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/cljs/cljs/core.cljs b/src/main/cljs/cljs/core.cljs index 3a94e5439..fc7dd7819 100644 --- a/src/main/cljs/cljs/core.cljs +++ b/src/main/cljs/cljs/core.cljs @@ -9315,16 +9315,16 @@ reduces them without incurring seq initialization" (defn select-keys "Returns a map containing only those entries in map whose key is in keys" [map keyseq] - (loop [ret {} keys (seq keyseq)] - (if keys - (let [key (first keys) - entry (get map key ::not-found)] - (recur - (if (not= entry ::not-found) - (assoc ret key entry) - ret) - (next keys))) - (-with-meta ret (meta map))))) + (loop [ret (transient {}) keys (seq keyseq)] + (if keys + (let [key (first keys) + entry (get map key lookup-sentinel)] + (recur + (if-not (identical? entry lookup-sentinel) + (-assoc! ret key entry) + ret) + (next keys))) + (-with-meta (persistent! ret) (meta map))))) ;;; PersistentHashSet diff --git a/src/test/cljs/cljs/core_test.cljs b/src/test/cljs/cljs/core_test.cljs index 933f87781..b3ad35b16 100644 --- a/src/test/cljs/cljs/core_test.cljs +++ b/src/test/cljs/cljs/core_test.cljs @@ -2022,3 +2022,9 @@ (req! m nil) "nil" (req! m :b) 2 (req! m :f) nil))) + +(deftest test-select-keys + (are [x y] (= x y) + (select-keys {:a 1 :b 2 :c nil} [:a :c :d]) {:a 1 :c nil} + (select-keys nil [:a]) {} + (select-keys #{:a :b} [:a :c]) {:a :a}))