       (let [new-root (.inode-without root nil 0 (hash k) k (Box. false false))]
         (if (identical? new-root root)
           coll
-          (PersistentHashMap. meta (dec cnt) new-root nil))))))
+          (PersistentHashMap. meta (dec cnt) new-root nil)))))
+
+  IKVReduce
+  (-kv-reduce [coll f init]
+    (cond
+      (reduced? init)          @init
+      (not (nil? root)) (.kv-reduce root f init)
+      :else                    init)))
 
 (set! (.-EMPTY PersistentHashMap) (PersistentHashMap. nil 0 nil empty-unordered-hash))
 

            ["dissoc"
             (count dhm1)
             (= (into #{} (vals dhm1)) (into #{} (range dtimes)))
             (= (into #{} (vals dhm1)) (into #{} (map #(get dhm1 (str "key" %)) (range dtimes))))
             (= (keys dhm1) (map (fn [[k v]] k) dhm1))
             (= (into #{} (keys dhm1)) (into #{} (map #(str "key" %) (range dtimes))))]))
  (do
    (js/console.profile "CLJS Map")

             (array-copy arr (* 2 (inc i)) new-arr (* 2 i) (- (alength new-arr) (* 2 i)))
             (HashCollisionNode. wedit hash (dec cnt) new-arr)))))))

  (kv-reduce [inode f init]
    (inode-kv-reduce arr cnt 0 f init))

  (single-kv? [_]
    false))

