This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2018-01-18
Channels
- # architecture (25)
- # beginners (57)
- # boot (3)
- # cider (38)
- # clara (6)
- # cljsrn (6)
- # clojure (54)
- # clojure-china (4)
- # clojure-greece (1)
- # clojure-italy (3)
- # clojure-romania (1)
- # clojure-russia (7)
- # clojure-spec (68)
- # clojure-uk (46)
- # clojurescript (73)
- # community-development (2)
- # core-async (7)
- # cursive (17)
- # datomic (143)
- # duct (2)
- # emacs (12)
- # events (5)
- # figwheel (3)
- # fulcro (15)
- # hoplon (19)
- # jobs (12)
- # jobs-discuss (85)
- # nginx (3)
- # off-topic (111)
- # onyx (7)
- # other-languages (1)
- # re-frame (30)
- # reagent (19)
- # remote-jobs (1)
- # ring (7)
- # rum (1)
- # shadow-cljs (18)
- # spacemacs (4)
- # specter (4)
- # sql (24)
- # test-check (1)
- # unrepl (10)
- # vim (6)
- # yada (1)
hi, first of all, I'm really enjoying specter and how easy makes many things, but I have a case where I'm thinking that maybe is better to not use specter. I have a map where I want to remove and rename some keys. e.g. with specter:
(->> {:id 1 :data_val 5 :bad nil}
(s/select-one (s/submap [:id :data_val]))
(s/transform [s/MAP-KEYS] #(case % :data_val :value %))
and without
(-> {:id 1 :data_val 5 :bad nil}
(select-keys [:id :data_val])
(clojure.set/rename-keys {:data_val :value}))
what do you think? makes sense to use specter here? Is there a better way to do it with specter?Almost the same perf I think that w/o spec is more readable, in this case.
(time
(doseq [i (range 1000000)]
(->> {:id 1 :data_val 5 :bad nil}
(s/select-one (s/submap [:id :data_val]))
(s/transform [s/MAP-KEYS] #(case % :data_val :value %)))))
"Elapsed time: 1031.939844 msecs"
=> nil
(time
(doseq [i (range 1000000)]
(-> {:id 1 :data_val 5 :bad nil}
(select-keys [:id :data_val])
(clojure.set/rename-keys {:data_val :value}))))
"Elapsed time: 1794.127254 msecs"
Mine is a bit faster. And has data/explicit params.
(let [n 10000000]
(prn "specter")
(time
(doseq [i (range n)]
(->> {:id 1 :data_val 5 :bad nil}
(s/select-one (s/submap [:id :data_val]))
(s/transform [s/MAP-KEYS] #(case % :data_val :value %)))))
(prn "@souenzzo")
(time
(doseq [i (range n)]
(let [from->to {:data_val :value
:id :id}]
(reduce-kv (fn [acc k v]
(if (contains? from->to k)
(assoc acc (from->to k) v)
acc)) {} {:id 1 :data_val 5 :bad nil})))))
@U2J4FRT2T thanks for your example, didn't know about reduce-kv