Skip to content

Commit 48ce221

Browse files
puredangerstuarthalloway
authored andcommitted
CLJ-1387: reduce-kv on hash map should handle reduced
Signed-off-by: Stuart Halloway <stu@cognitect.com>
1 parent f758350 commit 48ce221

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

src/jvm/clojure/lang/PersistentHashMap.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,13 @@ public Object kvreduce(IFn f, Object init){
182182
if(RT.isReduced(init))
183183
return ((IDeref)init).deref();
184184
if(root != null){
185-
return root.kvreduce(f,init);
186-
}
187-
return init;
185+
init = root.kvreduce(f,init);
186+
if(RT.isReduced(init))
187+
return ((IDeref)init).deref();
188+
else
189+
return init;
190+
}
191+
return init;
188192
}
189193

190194
public Object fold(long n, final IFn combinef, final IFn reducef,
@@ -405,7 +409,7 @@ public Object kvreduce(IFn f, Object init){
405409
if(node != null){
406410
init = node.kvreduce(f,init);
407411
if(RT.isReduced(init))
408-
return ((IDeref)init).deref();
412+
return init;
409413
}
410414
}
411415
return init;
@@ -1132,7 +1136,7 @@ static public Object kvreduce(Object[] array, IFn f, Object init){
11321136
init = node.kvreduce(f,init);
11331137
}
11341138
if(RT.isReduced(init))
1135-
return ((IDeref)init).deref();
1139+
return init;
11361140
}
11371141
return init;
11381142
}

test/clojure/test_clojure/reducers.clj

+19-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
;; Author: Tassilo Horn
1010

1111
(ns clojure.test-clojure.reducers
12-
(:require [clojure.core.reducers :as r])
12+
(:require [clojure.core.reducers :as r]
13+
[clojure.test.generative :refer (defspec)]
14+
[clojure.data.generators :as gen])
1315
(:use clojure.test))
1416

1517
(defmacro defequivtest
@@ -62,6 +64,22 @@
6264
(is (= {:k :v} (reduce-kv assoc {:k :v} nil)))
6365
(is (= 0 (r/fold + nil))))
6466

67+
(defn gen-num []
68+
(gen/uniform 0 2000))
69+
70+
(defn reduced-at-probe
71+
[m p]
72+
(reduce-kv (fn [_ k v] (when (== p k) (reduced :foo))) nil m))
73+
74+
(defspec reduced-always-returns
75+
(fn [probe to-end]
76+
(let [len (+ probe to-end 1)
77+
nums (range len)
78+
m (zipmap nums nums)]
79+
(reduced-at-probe m probe)))
80+
[^{:tag `gen-num} probe ^{:tag `gen-num} to-end]
81+
(assert (= :foo %)))
82+
6583
(deftest test-fold-runtime-exception
6684
(is (thrown? IndexOutOfBoundsException
6785
(let [test-map-count 1234

0 commit comments

Comments
 (0)