always preserve persistentarraymap for ALL and MAP-VALS, also improve performance of those cases by almost 2x

This commit is contained in:
Nathan Marz 2016-08-09 12:27:46 -04:00
parent 9a35c0666d
commit 9db244ebe5

View file

@ -107,15 +107,18 @@
#?(:clj #?(:clj
(all-transform [structure next-fn] (all-transform [structure next-fn]
(let [k-it (.keyIterator structure) (let [k-it (.keyIterator structure)
v-it (.valIterator structure)] v-it (.valIterator structure)
(loop [ret {}] array (i/fast-object-array (* 2 (.count structure)))]
(loop [i 0]
(if (.hasNext k-it) (if (.hasNext k-it)
(let [k (.next k-it) (let [k (.next k-it)
v (.next v-it) v (.next v-it)
[newk newv] (next-fn [k v])] [newk newv] (next-fn [k v])]
(recur (assoc ret newk newv))) (aset array i newk)
ret (aset array (inc i) newv)
))))) (recur (+ i 2)))))
(clojure.lang.PersistentArrayMap. array)
)))
#?(:cljs cljs.core/PersistentArrayMap) #?(:cljs cljs.core/PersistentArrayMap)
#?(:cljs #?(:cljs
@ -197,14 +200,18 @@
#?(:clj #?(:clj
(map-vals-transform [structure next-fn] (map-vals-transform [structure next-fn]
(let [k-it (.keyIterator structure) (let [k-it (.keyIterator structure)
v-it (.valIterator structure)] v-it (.valIterator structure)
(loop [ret {}] array (i/fast-object-array (* 2 (.count structure)))]
(loop [i 0]
(if (.hasNext k-it) (if (.hasNext k-it)
(let [k (.next k-it) (let [k (.next k-it)
v (.next v-it)] v (.next v-it)
(recur (assoc ret k (next-fn v)))) newv (next-fn v)]
ret (aset array i k)
))))) (aset array (inc i) newv)
(recur (+ i 2)))))
(clojure.lang.PersistentArrayMap. array)
)))
#?(:cljs cljs.core/PersistentArrayMap) #?(:cljs cljs.core/PersistentArrayMap)
#?(:cljs #?(:cljs