HashMap
type | removed v0.0-1798 | added v0.0-927 | Edit |
(HashMap. meta count hashobj __hash)
(deftype HashMap [meta count hashobj ^:mutable __hash]
Object
(toString [this]
(pr-str this))
IWithMeta
(-with-meta [coll meta] (HashMap. meta count hashobj __hash))
IMeta
(-meta [coll] meta)
ICollection
(-conj [coll entry]
(if (vector? entry)
(-assoc coll (-nth entry 0) (-nth entry 1))
(reduce -conj
coll
entry)))
IEmptyableCollection
(-empty [coll] (with-meta cljs.core.HashMap/EMPTY meta))
IEquiv
(-equiv [coll other] (equiv-map coll other))
IHash
(-hash [coll] (caching-hash coll hash-imap __hash))
ISeqable
(-seq [coll]
(when (pos? count)
(let [hashes (.sort (js-keys hashobj))]
(mapcat #(map vec (partition 2 (aget hashobj %)))
hashes))))
ICounted
(-count [coll] count)
ILookup
(-lookup [coll k] (-lookup coll k nil))
(-lookup [coll k not-found]
(let [bucket (aget hashobj (hash k))
i (when bucket (scan-array 2 k bucket))]
(if i
(aget bucket (inc i))
not-found)))
IAssociative
(-assoc [coll k v]
(let [h (hash k)
bucket (aget hashobj h)]
(if bucket
(let [new-bucket (aclone bucket)
new-hashobj (goog.object/clone hashobj)]
(aset new-hashobj h new-bucket)
(if-let [i (scan-array 2 k new-bucket)]
(do (aset new-bucket (inc i) v)
(HashMap. meta count new-hashobj nil))
(do (.push new-bucket k v)
(HashMap. meta (inc count) new-hashobj nil))))
(let [new-hashobj (goog.object/clone hashobj)] (aset new-hashobj h (array k v))
(HashMap. meta (inc count) new-hashobj nil)))))
(-contains-key? [coll k]
(let [bucket (aget hashobj (hash k))
i (when bucket (scan-array 2 k bucket))]
(if i
true
false)))
IMap
(-dissoc [coll k]
(let [h (hash k)
bucket (aget hashobj h)
i (when bucket (scan-array 2 k bucket))]
(if (not i)
coll (let [new-hashobj (goog.object/clone hashobj)]
(if (> 3 (alength bucket))
(js-delete new-hashobj h)
(let [new-bucket (aclone bucket)]
(.splice new-bucket i 2)
(aset new-hashobj h new-bucket)))
(HashMap. meta (dec count) new-hashobj nil)))))
IFn
(-invoke [coll k]
(-lookup coll k))
(-invoke [coll k not-found]
(-lookup coll k not-found)))