Skip to content

Commit a33fd68

Browse files
committed
CRRBV-29: Correct handling of reduce-kv for empty vectors
1 parent ce95b90 commit a33fd68

File tree

4 files changed

+56
-36
lines changed

4 files changed

+56
-36
lines changed

src/main/cljs/clojure/core/rrb_vector/rrbt.cljs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -480,24 +480,26 @@
480480

481481
IKVReduce
482482
(-kv-reduce [this f init]
483-
(loop [i 0
484-
j 0
485-
init init
486-
arr (-array-for this i)
487-
lim (dec (alength arr))
488-
step (inc lim)]
489-
(let [init (f init (+ i j) (aget arr j))]
490-
(if (reduced? init)
491-
@init
492-
(if (< j lim)
493-
(recur i (inc j) init arr lim step)
494-
(let [i (+ i step)]
495-
(if (< i cnt)
496-
(let [arr (-array-for this i)
497-
len (alength arr)
498-
lim (dec len)]
499-
(recur i 0 init arr lim len))
500-
init)))))))
483+
(if (zero? cnt)
484+
init
485+
(loop [i 0
486+
j 0
487+
init init
488+
arr (-array-for this i)
489+
lim (dec (alength arr))
490+
step (inc lim)]
491+
(let [init (f init (+ i j) (aget arr j))]
492+
(if (reduced? init)
493+
@init
494+
(if (< j lim)
495+
(recur i (inc j) init arr lim step)
496+
(let [i (+ i step)]
497+
(if (< i cnt)
498+
(let [arr (-array-for this i)
499+
len (alength arr)
500+
lim (dec len)]
501+
(recur i 0 init arr lim len))
502+
init))))))))
501503

502504
IComparable
503505
(-compare [this that]

src/main/clojure/clojure/core/rrb_vector/rrbt.clj

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,24 +1018,26 @@
10181018

10191019
IKVReduce
10201020
(kv-reduce [this f init]
1021-
(loop [i (int 0)
1022-
j (int 0)
1023-
init init
1024-
arr (.arrayFor this i)
1025-
lim (unchecked-dec-int (.alength am arr))
1026-
step (unchecked-inc-int lim)]
1027-
(let [init (f init (unchecked-add-int i j) (.aget am arr j))]
1028-
(if (reduced? init)
1029-
@init
1030-
(if (< j lim)
1031-
(recur i (unchecked-inc-int j) init arr lim step)
1032-
(let [i (unchecked-add-int i step)]
1033-
(if (< i cnt)
1034-
(let [arr (.arrayFor this i)
1035-
len (.alength am arr)
1036-
lim (unchecked-dec-int len)]
1037-
(recur i (int 0) init arr lim len))
1038-
init)))))))
1021+
(if (zero? cnt)
1022+
init
1023+
(loop [i (int 0)
1024+
j (int 0)
1025+
init init
1026+
arr (.arrayFor this i)
1027+
lim (unchecked-dec-int (.alength am arr))
1028+
step (unchecked-inc-int lim)]
1029+
(let [init (f init (unchecked-add-int i j) (.aget am arr j))]
1030+
(if (reduced? init)
1031+
@init
1032+
(if (< j lim)
1033+
(recur i (unchecked-inc-int j) init arr lim step)
1034+
(let [i (unchecked-add-int i step)]
1035+
(if (< i cnt)
1036+
(let [arr (.arrayFor this i)
1037+
len (.alength am arr)
1038+
lim (unchecked-dec-int len)]
1039+
(recur i (int 0) init arr lim len))
1040+
init))))))))
10391041

10401042
CollFold
10411043
;; adapted from #'clojure.core.reducers/foldvec

src/test/cljs/clojure/core/rrb_vector/test_common.cljs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@
8383
(reduce + 0 (r/map identity (seq v1)))
8484
(reduce + 0 (r/map identity (seq v2)))))))
8585

86+
(deftest test-reduce-3
87+
(let [v0 (vec [])
88+
rv0 (fv/vec [])]
89+
(testing "reduce"
90+
(is (= (reduce + v0) (reduce + rv0))))
91+
(testing "reduce-kv"
92+
(is (= (reduce-kv + 0 v0) (reduce-kv + 0 rv0))))))
93+
8694
(deftest test-seq
8795
(let [v (fv/vec (range 128))
8896
s (seq v)]

src/test/clojure/clojure/core/rrb_vector/test_common.clj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@
8383
(reduce + 0 (r/map identity (seq v1)))
8484
(reduce + 0 (r/map identity (seq v2)))))))
8585

86+
(deftest test-reduce-3
87+
(let [v0 (vec [])
88+
rv0 (fv/vec [])]
89+
(testing "reduce"
90+
(is (= (reduce + v0) (reduce + rv0))))
91+
(testing "reduce-kv"
92+
(is (= (reduce-kv + 0 v0) (reduce-kv + 0 rv0))))))
93+
8694
(deftest test-seq
8795
(let [v (fv/vec (range 128))
8896
s (seq v)]

0 commit comments

Comments
 (0)