From 0a6045892511d056ee057354944ec6d8d996a7ca Mon Sep 17 00:00:00 2001 From: Andrey Listopadov Date: Sat, 13 Mar 2021 11:31:54 +0300 Subject: fix: allow `reduced` to return nil and false values --- init.fnl | 20 ++++++++++---------- tests/core.fnl | 8 +++++++- 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)) -- cgit v1.2.3