From 69f5a39f854646c4098451a0705116ea72dee1ce Mon Sep 17 00:00:00 2001 From: Yogthos Date: Tue, 16 Jun 2026 09:12:30 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20RFC=200003=20=E2=80=94=20phm=20is=20a?= =?UTF-8?q?=20HAMT,=20sorted=20colls=20a=20red-black=20tree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The transients RFC described phm as "bucket-based copy-on-write" and mused about "if it ever becomes a HAMT" — it is one now (jolt-684u), and sorted maps/sets are a red-black tree (jolt-0hbr). Update the deviation/future-work notes accordingly. --- docs/rfc/0003-transients.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/rfc/0003-transients.md b/docs/rfc/0003-transients.md index a2a62c1..8c451db 100644 --- a/docs/rfc/0003-transients.md +++ b/docs/rfc/0003-transients.md @@ -53,7 +53,7 @@ are identical (O(n) total either way) with a better constant in the loop and a worse constant at the two edges. The pattern transients exist for — batch construction — is fully served. What is NOT served is transient-editing a *large* collection to change a few keys: that's O(n) in Jolt vs O(log n) in -Clojure, because `transient` flattens the pvec trie / phm buckets into a +Clojure, because `transient` flattens the pvec trie / phm HAMT into a native array/table and `persistent!` rebuilds them. **No thread-ownership check.** JVM Clojure ≥1.7 also dropped the owner-thread @@ -110,7 +110,9 @@ tiers as ordinary migration batches. - pvec is already a 32-way trie with structural sharing (pv.janet), so Clojure-style O(1) `transient`/`persistent!` via editable nodes is a real option for vectors — an internal change behind the same surface, not a - semantics change. phm is bucket-based copy-on-write; the same trick applies - if it ever becomes a HAMT. + semantics change. phm is now a HAMT with structural sharing too (jolt-684u), + and sorted maps/sets are a red-black tree (jolt-0hbr), so the same editable- + node trick is open for those as well — the transient surface here is still the + copy-to-native-table flatten. - `transient?` (Jolt extension, useful in tests) stays; Clojure has no public predicate, so it must not leak into portability-sensitive code.