PersistentVector
(PersistentVector. meta cnt shift root tail __hash)
(deftype PersistentVector [meta cnt shift root tail ^:mutable __hash]
Object
(toString [coll]
(pr-str* coll))
(equiv [this other]
(-equiv this other))
(indexOf [coll x]
(-indexOf coll x 0))
(indexOf [coll x start]
(-indexOf coll x start))
(lastIndexOf [coll x]
(-lastIndexOf coll x (count coll)))
(lastIndexOf [coll x start]
(-lastIndexOf coll x start))
ICloneable
(-clone [_] (PersistentVector. meta cnt shift root tail __hash))
IWithMeta
(-with-meta [coll new-meta]
(if (identical? new-meta meta)
coll
(PersistentVector. new-meta cnt shift root tail __hash)))
IMeta
(-meta [coll] meta)
IStack
(-peek [coll]
(when (> cnt 0)
(-nth coll (dec cnt))))
(-pop [coll]
(cond
(zero? cnt) (throw (js/Error. "Can't pop empty vector"))
(== 1 cnt) (-with-meta (.-EMPTY PersistentVector) meta)
(< 1 (- cnt (tail-off coll)))
(PersistentVector. meta (dec cnt) shift root (.slice tail 0 -1) nil)
:else (let [new-tail (unchecked-array-for coll (- cnt 2))
nr (pop-tail coll shift root)
new-root (if (nil? nr) (.-EMPTY-NODE PersistentVector) nr)
cnt-1 (dec cnt)]
(if (and (< 5 shift) (nil? (pv-aget new-root 1)))
(PersistentVector. meta cnt-1 (- shift 5) (pv-aget new-root 0) new-tail nil)
(PersistentVector. meta cnt-1 shift new-root new-tail nil)))))
ICollection
(-conj [coll o]
(if (< (- cnt (tail-off coll)) 32)
(let [len (alength tail)
new-tail (make-array (inc len))]
(dotimes [i len]
(aset new-tail i (aget tail i)))
(aset new-tail len o)
(PersistentVector. meta (inc cnt) shift root new-tail nil))
(let [root-overflow? (> (bit-shift-right-zero-fill cnt 5) (bit-shift-left 1 shift))
new-shift (if root-overflow? (+ shift 5) shift)
new-root (if root-overflow?
(let [n-r (pv-fresh-node nil)]
(pv-aset n-r 0 root)
(pv-aset n-r 1 (new-path nil shift (VectorNode. nil tail)))
n-r)
(push-tail coll shift root (VectorNode. nil tail)))]
(PersistentVector. meta (inc cnt) new-shift new-root (array o) nil))))
IEmptyableCollection
(-empty [coll] (-with-meta (.-EMPTY PersistentVector) meta))
ISequential
IEquiv
(-equiv [coll other]
(if (instance? PersistentVector other)
(if (== cnt (count other))
(let [me-iter (-iterator coll)
you-iter (-iterator other)]
(loop []
(if ^boolean (.hasNext me-iter)
(let [x (.next me-iter)
y (.next you-iter)]
(if (= x y)
(recur)
false))
true)))
false)
(equiv-sequential coll other)))
IHash
(-hash [coll] (caching-hash coll hash-ordered-coll __hash))
ISeqable
(-seq [coll]
(cond
(zero? cnt) nil
(<= cnt 32) (IndexedSeq. tail 0 nil)
:else (chunked-seq coll (first-array-for-longvec coll) 0 0)))
IDrop
(-drop [coll n]
(if (< n cnt)
(let [offset (js-mod n 32)]
(chunked-seq coll (unchecked-array-for coll n) (- n offset) offset))
nil))
ICounted
(-count [coll] cnt)
IIndexed
(-nth [coll n]
(aget (array-for coll n) (bit-and n 0x01f)))
(-nth [coll n not-found]
(if (and (<= 0 n) (< n cnt))
(aget (unchecked-array-for coll n) (bit-and n 0x01f))
not-found))
ILookup
(-lookup [coll k] (-lookup coll k nil))
(-lookup [coll k not-found] (if (number? k)
(-nth coll k not-found)
not-found))
IAssociative
(-assoc [coll k v]
(if (number? k)
(-assoc-n coll k v)
(throw (js/Error. "Vector's key for assoc must be a number."))))
(-contains-key? [coll k]
(if (integer? k)
(and (<= 0 k) (< k cnt))
false))
IFind
(-find [coll n]
(when (and (<= 0 n) (< n cnt))
(MapEntry. n (aget (unchecked-array-for coll n) (bit-and n 0x01f)) nil)))
APersistentVector
IVector
(-assoc-n [coll n val]
(cond
(and (<= 0 n) (< n cnt))
(if (<= (tail-off coll) n)
(let [new-tail (aclone tail)]
(aset new-tail (bit-and n 0x01f) val)
(PersistentVector. meta cnt shift root new-tail nil))
(PersistentVector. meta cnt shift (do-assoc coll shift root n val) tail nil))
(== n cnt) (-conj coll val)
:else (throw (js/Error. (str "Index " n " out of bounds [0," cnt "]")))))
IReduce
(-reduce [v f]
(pv-reduce v f 0 cnt))
(-reduce [v f init]
(loop [i 0 init init]
(if (< i cnt)
(let [arr (unchecked-array-for v i)
len (alength arr)
init (loop [j 0 init init]
(if (< j len)
(let [init (f init (aget arr j))]
(if (reduced? init)
init
(recur (inc j) init)))
init))]
(if (reduced? init)
@init
(recur (+ i len) init)))
init)))
IKVReduce
(-kv-reduce [v f init]
(loop [i 0 init init]
(if (< i cnt)
(let [arr (unchecked-array-for v i)
len (alength arr)
init (loop [j 0 init init]
(if (< j len)
(let [init (f init (+ j i) (aget arr j))]
(if (reduced? init)
init
(recur (inc j) init)))
init))]
(if (reduced? init)
@init
(recur (+ i len) init)))
init)))
IFn
(-invoke [coll k]
(if (number? k)
(-nth coll k)
(throw (js/Error. "Key must be integer"))))
IEditableCollection
(-as-transient [coll]
(TransientVector. cnt shift (tv-editable-root root) (tv-editable-tail tail)))
IReversible
(-rseq [coll]
(when (pos? cnt)
(RSeq. coll (dec cnt) nil)))
IIterable
(-iterator [this]
(ranged-iterator this 0 cnt)))