|
87 | 87 | (contains? model :elements-model) |
88 | 88 | (reduce-update :elements-model walk (conj path :elements-model))) |
89 | 89 | :map-of (-> [[stack walked-bindings] model] |
90 | | - (reduce-update-in [:keys :model] walk (conj path :keys :model)) |
91 | | - (reduce-update-in [:values :model] walk (conj path :values :model))) |
| 90 | + (reduce-update :entry-model walk (conj path :entry-model))) |
92 | 91 | (:and :or |
93 | 92 | :map :sequence |
94 | 93 | :alt :cat) (cond-> [[stack walked-bindings] model] |
|
144 | 143 | [model stack path] |
145 | 144 | (let [distance (case (:type model) |
146 | 145 | (:fn :enum) 0 |
147 | | - :map-of (let [key-distance (-> model :keys :model ::leaf-distance) |
148 | | - value-distance (-> model :values :model ::leaf-distance)] |
| 146 | + :map-of (let [entry-distance (-> model :entry-model ::leaf-distance)] |
149 | 147 | (cond |
150 | 148 | (zero? (min-count-value model)) 0 |
151 | | - (and key-distance value-distance) (inc (max key-distance value-distance)))) |
| 149 | + (some? entry-distance) (inc entry-distance))) |
152 | 150 | (:set-of |
153 | 151 | :sequence-of |
154 | 152 | :repeat) (if (or (not (contains? model :elements-model)) |
|
186 | 184 | (:fn :enum) (::min-cost model 1) |
187 | 185 | :map-of (let [container-cost 1 |
188 | 186 | min-count (min-count-value model) |
189 | | - key-min-cost (-> model :keys :model ::min-cost) |
190 | | - value-min-cost (-> model :values :model ::min-cost) |
| 187 | + entry-min-cost (-> model :entry-model ::min-cost |
| 188 | + ; cancel the cost of the entry's vector |
| 189 | + (some-> dec)) |
191 | 190 | content-cost (if (zero? min-count) 0 |
192 | | - (when (and min-count key-min-cost value-min-cost) |
193 | | - (* min-count (+ key-min-cost value-min-cost))))] |
| 191 | + (when (and min-count entry-min-cost) |
| 192 | + (* min-count entry-min-cost)))] |
194 | 193 | (some-> content-cost (+ container-cost))) |
195 | 194 | (:set-of |
196 | 195 | :sequence-of |
|
392 | 391 |
|
393 | 392 | :map-of (cond->> (let [budget (max 0 (dec budget)) ; the collection itself costs 1 |
394 | 393 | count-model (:count-model model) |
395 | | - keys-model (-> model :keys :model) |
396 | | - values-model (-> model :values :model) |
397 | | - entry-min-cost (+ (::min-cost keys-model) |
398 | | - (::min-cost values-model)) |
| 394 | + entry-model (:entry-model model) |
| 395 | + entry-min-cost (::min-cost entry-model) |
399 | 396 | coll-max-size (int (/ budget entry-min-cost)) |
400 | 397 | coll-size-gen (if count-model |
401 | 398 | (generator context count-model 0) |
|
407 | 404 | entries-gen (gen/bind budgets-gen |
408 | 405 | (fn [entry-budgets] |
409 | 406 | (apply gen/tuple |
410 | | - (mapv (fn [entry-budget] |
411 | | - (gen/tuple |
412 | | - (generator context keys-model entry-budget) |
413 | | - (generator context values-model entry-budget))) |
| 407 | + (mapv (partial generator context entry-model) |
414 | 408 | entry-budgets)))) |
415 | 409 | map-gen (gen/fmap (fn [entries] |
416 | 410 | (into {} entries)) |
|
0 commit comments