core: Phase 4 — move reduce-kv to the overlay, fixing the vector case
reduce-kv is pure over reduce/keys/get/nth, so it moves to 20-coll with no host surface. Both branches fold through reduce, which fixes two latent bugs in the Janet version: on a vector it saw the pvec as a table and folded over its internal keys instead of the indices, and it ignored reduced entirely. nil folds to init. Added vector-index, reduced, and nil spec cases plus a 3-mode conformance case for the vector fix.
This commit is contained in:
parent
e6ff4b8a77
commit
fcdf0ff535
4 changed files with 16 additions and 8 deletions
|
|
@ -225,3 +225,14 @@
|
|||
;; namespace-munge: Clojure namespace name -> legal Java package name (- -> _).
|
||||
(defn namespace-munge [s]
|
||||
(apply str (map (fn [c] (if (= c \-) \_ c)) (seq (str s)))))
|
||||
|
||||
;; reduce-kv over a map (k v) or vector (index v). Both branches go through reduce,
|
||||
;; so reduced short-circuits — and the vector path indexes correctly. (The prior
|
||||
;; Janet version saw a pvec as a table and folded over its internal keys; it also
|
||||
;; ignored reduced.) nil folds to init, matching Clojure.
|
||||
(defn reduce-kv [f init coll]
|
||||
(cond
|
||||
(vector? coll) (reduce (fn [acc i] (f acc i (nth coll i))) init (range (count coll)))
|
||||
(map? coll) (reduce (fn [acc k] (f acc k (get coll k))) init (keys coll))
|
||||
(nil? coll) init
|
||||
:else (throw (str "reduce-kv not supported on: " coll))))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue