diff options
| author | Andrey Orst <andreyorst@gmail.com> | 2020-11-15 17:50:34 +0300 |
|---|---|---|
| committer | Andrey Orst <andreyorst@gmail.com> | 2020-11-15 17:50:34 +0300 |
| commit | aec65aee793ece4416d7f5f50fc3a326deba8917 (patch) | |
| tree | ee7533a33cc33e00fdd994f0d852497078b1067b | |
| parent | 0c1e26ef51ccbc70039b7e16112ea38d8b4e6197 (diff) | |
fix(core): fix reduce-kv and tests
| -rw-r--r-- | cljlib.fnl | 29 | ||||
| -rw-r--r-- | tests/core.fnl | 21 |
2 files changed, 28 insertions, 22 deletions
@@ -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)) |