summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Listopadov <andreyorst@gmail.com>2021-03-13 11:31:54 +0300
committerAndrey Listopadov <andreyorst@gmail.com>2021-03-13 11:31:54 +0300
commit0a6045892511d056ee057354944ec6d8d996a7ca (patch)
treec0c30a15c7bfb878495e71bf21ef60ace01041c5
parent7e32709879d00369b9b6677d7401c7c78a131223 (diff)
fix: allow `reduced` to return nil and false values
-rw-r--r--init.fnl20
-rw-r--r--tests/core.fnl8
2 files changed, 17 insertions, 11 deletions
diff --git a/init.fnl b/init.fnl
index a56da51..567ee4f 100644
--- a/init.fnl
+++ b/init.fnl
@@ -625,16 +625,16 @@ Reduce sequence of numbers with `add'
_ (let [[a b & rest] col]
(reduce f (f a b) rest)))))
([f val col]
- (if-some [reduced (when-some [m (getmetatable val)]
- (and m.cljlib/reduced
- (= m.cljlib/reduced.status :ready)
- m.cljlib/reduced.val))]
- reduced
- (let [col (or (seq col) (empty []))]
- (let [[x & xs] col]
- (if (nil? x)
- val
- (reduce f (f val x) xs)))))))
+ (let [m (getmetatable val)]
+ (if (and m
+ m.cljlib/reduced
+ (= m.cljlib/reduced.status :ready))
+ m.cljlib/reduced.val
+ (let [col (or (seq col) (empty []))]
+ (let [[x & xs] col]
+ (if (nil? x)
+ val
+ (reduce f (f val x) xs))))))))
(fn* core.reduced
"Wraps `x' in such a way so `reduce' will terminate early
diff --git a/tests/core.fnl b/tests/core.fnl
index 69a6678..f76e58c 100644
--- a/tests/core.fnl
+++ b/tests/core.fnl
@@ -411,11 +411,17 @@
(assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) 0 [10 5]) 15)
(assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) 1 [10 7]) -1)
+ (assert-eq (reduce #(if (> $1 10) (reduced false) (+ $1 $2)) 1 [10 7]) false)
+ (assert-eq (reduce #(if (> $1 10) (reduced nil) (+ $1 $2)) 1 [10 7]) nil)
+
(assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced -1) (+ res v))) 0 {:a 1 :b 2}) 3)
(assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced -1) (+ res v))) 0 {:a 10 :b 2}) 12)
(assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced -1) (+ res v))) 1 {:a 3 :b 3 :c 3 :d 3}) 13)
(assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced -1) (+ res v))) 2 {:a 3 :b 3 :c 3 :d 3}) -1)
- (assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced -1) (+ res v))) 1 [10 12]) -1))
+ (assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced -1) (+ res v))) 1 [10 12]) -1)
+
+ (assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced false) (+ res v))) 1 [10 12]) false)
+ (assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced nil) (+ res v))) 1 [10 12]) nil))
(testing "assoc"
(assert-not (pcall assoc))