phm: preserve nil-valued keys in get/keys/vals
phm-get returned the default for a key present with a nil value; fix it to presence-check the bucket so a nil value reads back as nil, not the default. core-keys/core-vals went through phm-to-struct, which drops nil-valued keys — read phm-entries directly instead so those keys survive. Isolated phm correctness only; no map-representation change. Battery holds at 3919, conformance 218/218 in all three modes. The earlier -8 came from assoc's struct->phm promotion, not these accessors.
This commit is contained in:
parent
0878c803d7
commit
bd76eddb74
2 changed files with 8 additions and 3 deletions
|
|
@ -655,10 +655,11 @@
|
|||
(do (var result @{}) (each m maps (each k (if (phm? m) (keys (phm-to-struct m)) (keys m)) (let [existing (result k)] (put result k (if (nil? existing) (m k) (f existing (m k))))))) (table/to-struct result))))
|
||||
|
||||
(defn core-keys [m]
|
||||
(if (phm? m) (tuple ;(keys (phm-to-struct m))) (tuple ;(keys m))))
|
||||
# phm-entries (not phm-to-struct) so keys mapped to nil values are not dropped.
|
||||
(if (phm? m) (tuple ;(map |(in $ 0) (phm-entries m))) (tuple ;(keys m))))
|
||||
|
||||
(defn core-vals [m]
|
||||
(if (phm? m) (do (def s (phm-to-struct m)) (tuple ;(map |(s $) (keys s)))) (tuple ;(map |(m $) (keys m)))))
|
||||
(if (phm? m) (tuple ;(map |(in $ 1) (phm-entries m))) (tuple ;(map |(m $) (keys m)))))
|
||||
|
||||
(defn core-select-keys [m ks]
|
||||
(var result @{})
|
||||
|
|
|
|||
|
|
@ -72,7 +72,11 @@
|
|||
(defn phm-get [m k &opt default]
|
||||
(default default nil)
|
||||
(let [bucket (get (m :buckets) (phm-hash-key k))]
|
||||
(if bucket (let [v (phm-bucket-find bucket k)] (if (nil? v) default v)) default)))
|
||||
# presence-check, not nil-of-value: a key mapped to nil is still present,
|
||||
# so return nil (not the default) when the key exists with a nil value.
|
||||
(if (and bucket (phm-bucket-contains? bucket k))
|
||||
(phm-bucket-find bucket k)
|
||||
default)))
|
||||
|
||||
(defn phm-assoc [m k v]
|
||||
(let [cnt (m :cnt) idx (phm-hash-key k)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue