From aec65aee793ece4416d7f5f50fc3a326deba8917 Mon Sep 17 00:00:00 2001 From: Andrey Orst Date: Sun, 15 Nov 2020 17:50:34 +0300 Subject: fix(core): fix reduce-kv and tests --- cljlib.fnl | 29 ++++++++++++++--------------- tests/core.fnl | 21 ++++++++++++++------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/cljlib.fnl b/cljlib.fnl index e953675..98bb98e 100644 --- a/cljlib.fnl +++ b/cljlib.fnl @@ -285,6 +285,14 @@ Additionally you can use [`conj`](#conj) and [`apply`](#apply) with :nil nil _ (error (.. "expected table, string or nil") 2)))) +(fn* core.kvseq + "Transforms any table kind to key-value sequence." + [tbl] + (let [res (empty [])] + (each [k v (pairs tbl)] + (insert res [k v])) + res)) + (fn* core.first "Return first element of a table. Calls `seq` on its argument." [col] @@ -512,14 +520,13 @@ Reduce table by adding values from keys that start with letter `a`: ```" [f val tbl] (var res val) - (each [_ [k v] (pairs (or (seq tbl) (empty [])))] + (each [_ [k v] (ipairs (or (kvseq tbl) (empty [])))] (set res (f res k v)) - (when-some [reduced (when-some [m (getmetatable res)] - (and m.cljlib/reduced - (= m.cljlib/reduced.status :ready) - m.cljlib/reduced.val))] - (set res reduced) - (lua :break))) + (match (getmetatable res) + m (if (and m.cljlib/reduced + (= m.cljlib/reduced.status :ready)) + (do (set res m.cljlib/reduced.val) + (lua :break))))) res) (fn* core.mapv @@ -614,14 +621,6 @@ Basic `zipmap` implementation: (filter pred r))) (empty []))) -(fn* core.kvseq - "Transforms any table kind to key-value sequence." - [tbl] - (let [res (empty [])] - (each [k v (pairs tbl)] - (insert res [k v])) - res)) - (fn* core.identity "Returns its argument." [x] x) (fn* core.comp diff --git a/tests/core.fnl b/tests/core.fnl index 3939458..d5aa57b 100644 --- a/tests/core.fnl +++ b/tests/core.fnl @@ -83,12 +83,13 @@ (assert-eq index-a (. (getmetatable a) :__index)) (assert-eq index-b (. (getmetatable b) :__index))))) -(testing "range" - (assert-not (pcall range)) - (assert-eq (range 10) [0 1 2 3 4 5 6 7 8 9]) - (assert-eq (range -5 5) [-5 -4 -3 -2 -1 0 1 2 3 4]) - (assert-eq [0 0.2 0.4 0.6 0.8] [0 0.2 0.4 0.6 0.8]) - (assert-eq (range 0 1 0.2) (range 0 1 0.2))) +(deftest range + (testing "range" + (assert-not (pcall range)) + (assert-eq (range 10) [0 1 2 3 4 5 6 7 8 9]) + (assert-eq (range -5 5) [-5 -4 -3 -2 -1 0 1 2 3 4]) + (assert-eq [0 0.2 0.4 0.6 0.8] [0 0.2 0.4 0.6 0.8]) + (assert-eq (range 0 1 0.2) (range 0 1 0.2)))) (deftest predicates (testing "zero?" @@ -311,6 +312,7 @@ (testing "reduce-kv" (assert-eq (reduce-kv #(+ $1 $3) 0 {:a 1 :b 2 :c 3}) 6) + (assert-eq (reduce-kv #(+ $1 $3) 0 [1 2 3]) 6) (assert-not (pcall reduce-kv #(+ $1 $3) 0)) (assert-not (pcall reduce-kv #(+ $1 $3))) (assert-not (pcall reduce-kv))) @@ -323,10 +325,15 @@ (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) [1 2 3 4 5 6]) -1) (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) 10 [1]) 11) (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) 10 [1 2]) -1) + (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-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 10 :b 2}) -1)) + (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)) (testing "assoc" (assert-not (pcall assoc)) -- cgit v1.2.3