data.priority-map: deftype interop fixes (rseq, arity-overload, empty, Sorted)

data.priority-map's whole suite passes (4/4). It leans on deftype/collection
interop jolt got wrong; four general fixes:

- rseq dispatches to a deftype's clojure.lang.Reversible.rseq method instead of
  always demanding a vector/sorted-coll (natives-seq.ss).
- a deftype method declared at two arities from two interfaces now dispatches by
  arity: the priority-map has seq[this] (Seqable) and seq[this ascending]
  (Sorted), so (.seq pm false) must reach the 2-arg one. find-method-any-protocol
  now matches the call's arg count via procedure-arity-mask, and a deftype's own
  declared method wins over the generic collection interop in dot-forms.
- (empty x) on a deftype/record with its own empty method uses it rather than
  returning {} (jolt.host/jrec-method? gate in clojure.core/empty).
- clojure.lang.Sorted (comparator / entryKey / seqFrom) works on jolt's
  sorted-map/set, so subseq/rsubseq run — including the priority-map delegating
  .comparator to its backing sorted-map (dot-forms.ss + host-static.ss).

Listed in docs/libraries.md + the site. One re-mint (clojure.core/empty);
everything else runtime. make test green (0 new divergences), shakesmoke
byte-identical.
This commit is contained in:
Yogthos 2026-06-27 16:48:14 -04:00
parent 8a4df7b204
commit 75f6bc79d1
7 changed files with 80 additions and 5 deletions

View file

@ -487,7 +487,7 @@
(guard (e (#t #f))
(def-var! "clojure.core" "reverse" (letrec ((reverse (lambda (coll) (let fnrec4586 ((coll coll)) (jolt-reduce jolt-conj (jolt-list ) coll))))) reverse)))
(guard (e (#t #f))
(def-var! "clojure.core" "empty" (letrec ((empty (lambda (coll) (let fnrec4587 ((coll coll)) (if (jolt-nil? coll) jolt-nil (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "sorted?") coll)) (jolt-invoke (jolt-get (jolt-invoke (var-deref "jolt.host" "ref-get") coll (keyword #f "ops")) (keyword #f "empty")) coll) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "map?") coll)) (let* ((_a$4588 (var-deref "clojure.core" "with-meta")) (_a$4589 (jolt-hash-map)) (_a$4590 (jolt-invoke (var-deref "clojure.core" "meta") coll))) (jolt-invoke _a$4588 _a$4589 _a$4590)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "set?") coll)) (let* ((_a$4591 (var-deref "clojure.core" "with-meta")) (_a$4592 (jolt-hash-set)) (_a$4593 (jolt-invoke (var-deref "clojure.core" "meta") coll))) (jolt-invoke _a$4591 _a$4592 _a$4593)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "vector?") coll)) (let* ((_a$4594 (var-deref "clojure.core" "with-meta")) (_a$4595 (jolt-vector)) (_a$4596 (jolt-invoke (var-deref "clojure.core" "meta") coll))) (jolt-invoke _a$4594 _a$4595 _a$4596)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "coll?") coll)) (jolt-invoke (var-deref "clojure.core" "with-meta") (jolt-list ) (jolt-invoke (var-deref "clojure.core" "meta") coll)) (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil))))))))))) empty)))
(def-var! "clojure.core" "empty" (letrec ((empty (lambda (coll) (let fnrec4587 ((coll coll)) (if (jolt-nil? coll) jolt-nil (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "jrec-method?") coll "empty")) (record-method-dispatch coll "empty" (jolt-vector)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "sorted?") coll)) (jolt-invoke (jolt-get (jolt-invoke (var-deref "jolt.host" "ref-get") coll (keyword #f "ops")) (keyword #f "empty")) coll) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "map?") coll)) (let* ((_a$4588 (var-deref "clojure.core" "with-meta")) (_a$4589 (jolt-hash-map)) (_a$4590 (jolt-invoke (var-deref "clojure.core" "meta") coll))) (jolt-invoke _a$4588 _a$4589 _a$4590)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "set?") coll)) (let* ((_a$4591 (var-deref "clojure.core" "with-meta")) (_a$4592 (jolt-hash-set)) (_a$4593 (jolt-invoke (var-deref "clojure.core" "meta") coll))) (jolt-invoke _a$4591 _a$4592 _a$4593)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "vector?") coll)) (let* ((_a$4594 (var-deref "clojure.core" "with-meta")) (_a$4595 (jolt-vector)) (_a$4596 (jolt-invoke (var-deref "clojure.core" "meta") coll))) (jolt-invoke _a$4594 _a$4595 _a$4596)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "coll?") coll)) (jolt-invoke (var-deref "clojure.core" "with-meta") (jolt-list ) (jolt-invoke (var-deref "clojure.core" "meta") coll)) (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil)))))))))))) empty)))
(guard (e (#t #f))
(def-var! "clojure.core" "assoc-in" (letrec ((assoc-in (lambda (m G__130 v) (let fnrec4597 ((m m) (G__130 G__130) (v v)) (let* ((G__131 G__130) (k (jolt-nth G__131 0 jolt-nil)) (ks (jolt-invoke (var-deref "clojure.core" "nthnext") G__131 1))) (if (jolt-truthy? ks) (jolt-assoc m k (assoc-in (jolt-get m k) ks v)) (jolt-assoc m k v))))))) assoc-in)))
(guard (e (#t #f))