Liking cljdoc? Tell your friends :D

BYTE OWNED-TREE DELETION MAP — L3.3c-C2 (Irreversible)

Design Reference: docs/design/slice3-l33c-execution-plan-2026-06-09.md §1a, §2-§6

Execution: Single atomic commit (C2, after C1 BLOCKER#4 fallback-port).


FILE-BY-FILE DELETION SPECIFICATION

1. src/persistent_artrie/mutation_core.rs (448 lines)

STATUS: DELETE as entire cluster (self-referential, entangled with TrieRoot field/type)

SymbolLinesVerdictReason
pub(super) fn insert_impl44–79DELETEWAL-logged insert wrapper; owned-only, dead post-step-1 collapse
pub(super) fn insert_impl_core88–105DELETECore insert against TrieRoot::*; mutation only under inner OR lock
fn insert_into_root111–254DELETEReentrancy-safe insert into &mut TrieRoot; bucket→ART conversion recursion
pub(super) fn remove_impl259–274DELETEWAL-logged remove wrapper; owned-only, dead post-step-1 collapse
pub(super) fn remove_impl_core280–296DELETECore remove against TrieRoot::*; mutation only under inner OR lock
fn remove_from_root299–376DELETEReentrancy-safe remove from &mut TrieRoot; recursive descent
fn convert_root_bucket_to_art380–413DELETEBucket→ART promotion for root; called only from insert_into_root
pub(super) fn insert_impl_no_wal420–423DELETE (Step 2)Recovery replay insert; deletes in step 2 when owned loaders gone
pub(super) fn remove_impl_no_wal429–433DELETE (Step 2)Recovery replay remove; marked #[allow(dead_code)], deletes in step 2
pub(super) fn upsert_impl_no_wal441–446DELETE (Step 2)Recovery replay upsert; deletes in step 2 when owned loaders gone

2. src/persistent_artrie/transitions.rs (~900 lines)

STATUS: DELETE owned-write/transition surface; KEEP decode surface + ChildNode overlay variants

SymbolLinesVerdictReason
pub struct BucketToArtResult48–57DELETEOnly returned by bucket_to_art_node; unused after
pub struct ArtToBucketResult61–64DELETEOnly returned by art_node_to_bucket; unused after
pub enum TransitionError + impl68–102DELETEOnly used by deleted transition functions
pub fn should_convert_bucket_to_art109–117DELETECalled only from bucket_to_art_node
pub fn bucket_to_art_node125–237DELETECalled only from convert_root_bucket_to_art + ChildNode::insert_key/insert_with_value (both deleted)
pub fn should_merge_art_to_bucket243–246DELETEART→bucket merge; no caller in owned delete scope
pub fn art_node_to_bucket252–294DELETEART→bucket merge result; unused after owned deletion
pub fn insert_key (ChildNode method)503–566DELETEOwned-only recursive insert into child; used only in bucket_to_art_node + insert_into_root paths
pub fn insert_with_value (ChildNode method)586–659DELETEOwned-only recursive insert with value; same caller paths
pub fn remove_key (ChildNode method)679–715DELETEOwned-only recursive remove; no caller in overlay path
pub fn contains_key (ChildNode method)735–761DELETEOwned-only recursive contains check; unused post-step-1

KEEP: All ChildNode helper methods + overlay-only variants:

  • is_bucket(), is_disk_ref(), as_disk_ref(), needs_persistence(), mark_has_dirty_descendants(), clear_dirty_flags(), mark_dirty(), as_bucket(), as_bucket_mut(), as_art_node(), as_art_node_mut() — KEEP (used by overlay + disk-backed paths)
  • ChildNode enum variants: Bucket(StringBucket), ArtNode { ... }, DiskRef { ptr: SwizzledPtr } — KEEP

3. src/persistent_artrie/node_impl.rs (~400 lines)

STATUS: DELETE owned NodeInner variants + constructors; KEEP Overlay + PersistentARTrieNode struct

SymbolLinesVerdictReason
pub struct PersistentARTrieNode<V>35–40KEEPRoot node wrapper for DictionaryNode trait
struct BucketPosition43–51DELETEOnly used by owned Bucket/Root match arms
enum NodeInner::ArtNode { ... }60–75DELETEOwned variant; replaced by Overlay
enum NodeInner::Bucket { ... }77–80DELETEOwned variant; replaced by Overlay
enum NodeInner::Root { ... }82–91DELETEOwned root variant; replaced by Overlay
enum NodeInner::Empty93DELETEOwned empty marker; Overlay handles all paths
enum NodeInner::Overlay { ... }101–111KEEPLock-free overlay; sole forward path
pub fn new_root()146–156DELETECreates Root variant; no owned construction post-flip
pub fn new_root_with_children()159–174DELETECreates Root variant with children; used only by get_root_node() (deleting)
pub fn new_art_node()179–189DELETECreates ArtNode variant; no owned construction
pub fn new_art_node_with_children()192–207DELETECreates ArtNode with children; used only by internal owned paths
pub fn new_bucket()210–215DELETECreates Bucket variant; no owned construction
pub(crate) fn new_overlay()221–229KEEPCreates Overlay variant; sole forward constructor
fn overlay_child_node()236–250KEEPResolves Overlay child slots; used by Overlay traversal
(All other overlay-specific methods)251+KEEPOverlay traversal + DictionaryNode trait impl for overlay

Remaining Deletions in node_impl.rs: All match NodeInner::ArtNode/Bucket/Root/Empty arms throughout file; all owned impl DictionaryNode specializations for owned variants.


4. src/persistent_artrie/dict_impl.rs (~2000 lines)

STATUS: DELETE TrieRoot enum + root field + dirty_prefixes field (LAST step, field dies last)

SymbolLinesVerdictReason
pub(crate) enum TrieRoot<V>464–479DELETEOwned root union type; replaced by overlay-only state
pub(crate) root: RwLock<TrieRoot<V>> field280DELETEInner RwLock; the "OR-lock" itself — field deletion = lock deletion
pub(crate) dirty_prefixes: std::sync::Mutex<HashSet<Vec<u8>>> field345DELETEOwned dirty-tracking cache; no longer needed post-overlay-only
pub(super) fn get_root_node()505–520DELETESole owned root constructor; reads from self.root under held guard, returns PersistentARTrieNode::new_root_with_children()
Owned-specific dirty-tracking reader block1874–1970+DELETETests + internal checkpoint readers that access dict.dirty_prefixes
fn bytes_le(...)~106DELETE (if orphaned)u32 serializer; check if any caller remains post-serialize_impl cleanup

5. src/persistent_artrie/dirty_tracking.rs (158 lines)

STATUS: DELETE entire module OR convert to stubs (all functions marked with F4 = owned-only)

SymbolLinesVerdictReason
pub(super) fn record_dirty_path()42–53DELETERecords paths to dirty_prefixes Mutex; owned-only mutation tracking
pub(super) fn path_needs_persistence()57–62DELETEChecks if path in dirty_prefixes; owned-only read
pub(super) fn propagate_dirty_to_root()74–78DELETESets HAS_DIRTY_DESCENDANTS on root; marked #[allow(dead_code)], used only in owned hot paths
pub(super) fn cache_disk_location()82–86DELETECaches disk locations for clean-subtree skip; owned-only optimization
pub(super) fn get_cached_disk_location()90–101DELETERetrieves cached disk location; owned-only
pub(super) fn resolve_and_cache_disk_location()105–115DELETEResolves DiskRef + caches; marked #[allow(dead_code)], owned-only
pub(super) fn clear_dirty_tracking_state()122–128DELETEClears dirty_prefixes Mutex + OR flags; owned-only post-checkpoint
fn clear_dirty_flags_recursive()133–143DELETERecursive dirty-flag clear; owned-only mutation
fn clear_child_dirty_flags_recursive()146–157DELETEChild flag clear; owned-only helper

Consideration: Entire module can be deleted, OR individual functions can be commented out with #[deprecated] stubs if inline dirty_tracking remains. The current approach: DELETE entire file (no callers remain post-step-1 collapse in dict_impl + overlay checkpoint).


6. src/persistent_artrie/disk_load.rs (1164 lines)

STATUS: DELETE owned loaders; KEEP enumerate_terms_from_disk + decode surface

SymbolLinesVerdictReason
fn load_root_from_disk()89–219DELETELoads owned root from disk; dead post-step-1
pub(super) fn load_root_from_disk_with_arena()333–506DELETELoads owned root + recurses through children; pre-flip eager loader
fn load_art_node_with_children()220–253DELETEHelper for owned ART node load
fn load_child_from_disk()254–332DELETEHelper for owned child load
fn load_art_node_with_children_from_arena()711–758DELETEOwned ART child loader with arena; called only by load_root_from_disk_with_arena
fn load_child_from_disk_with_arena()759–846DELETEOwned child loader with arena; called only by owned paths
fn load_single_art_node_data()847–892DELETE (if orphaned)Loads single ART node data; check if enumerate_terms_from_disk uses it
fn load_single_child_data()893–965DELETE (if orphaned)Loads single child data; check if enumerate_terms_from_disk uses it
fn load_art_node_with_children_from_arena_iterative()966+DELETE (if orphaned)Iterative variant; check callers

KEEP: These are SOLE reopen path post-C2:

  • pub(super) fn enumerate_terms_from_disk() | 507–710 | KEEP | Sole reopen path; loads all terms from disk-resident bucket data (no TrieRoot construction) |
  • pub struct SingleChildData | (embedded in file) | KEEP | Data structure for enum_terms_from_disk |
  • StringBucket decode surface: from_bytes(), len(), get_entry(), get_suffix(), get_value(), search(), contains(), iter(), as_bytes(), header(), etc. — KEEP (used by enumerate_terms_from_disk + overlay load path)

7. src/persistent_artrie/bucket.rs (~500 lines)

STATUS: KEEP decode surface (used by enumerate_terms_from_disk + overlay); DELETE write/split only when compiler confirms orphan

SymbolLinesVerdictReason
impl StringBucket { insert(...) }(multiple)DELETE (if orphaned)Write surface; called by insert_into_root + bucket_to_art_node (both deleting)
impl StringBucket { insert_key(...) }(multiple)DELETE (if orphaned)Write surface; called by insert_into_root + ChildNode::insert_key (both deleting)
impl StringBucket { split(...) }(multiple)DELETE (if orphaned)Split logic; called only by owned paths
impl StringBucket { split_by_first_byte(...) }(multiple)DELETE (if orphaned)Split helper; called by bucket_to_art_node (deleting)
KEEP decode surface: from_bytes(), len(), get_entry(), get_suffix(), get_value(), search(), contains(), iter(), as_bytes(), header(), remove()(multiple)KEEPUsed by enumerate_terms_from_disk, overlay load, overlay traversal
pub struct StringEntry(definition)KEEPUsed by decode surface
pub struct BucketHeader(definition)KEEPUsed by all StringBucket operations

Compiler check: After deleting insert_impl/bucket_to_art_node/ChildNode insert methods, cargo check will flag any remaining write-surface callers. Delete them when confirmed orphaned.


8. src/persistent_artrie/path_compression.rs

STATUS: VERIFY via compiler; KEEP if CX codec (task #43) uses them

SymbolVerdictReason
pub fn common_prefix_len(...) -> usizeVERIFYCheck if CX codec (overlay encoding) calls this
pub fn make_common_prefix(...) -> Vec<u8>VERIFYCheck if CX codec calls this

If CX codec (compact_encoding.rs) calls these, KEEP. If not, DELETE.


9. src/persistent_artrie/serialize_impl.rs

STATUS: DELETE no-value wrapper; KEEP value-len variant

SymbolLinesVerdictReason
pub(super) fn serialize_node_to_disk(...) -> Result<usize>~57DELETENo-value wrapper; dead per design §0.5
pub(super) fn serialize_node_to_disk_with_value_len(...) -> Result<usize>~956, ~997KEEPLIVE caller at overlay_checkpoint.rs:956, 997

10. src/persistent_artrie/persistence_api.rs

STATUS: DELETE owned WAL append

SymbolLinesVerdictReason
pub(super) fn append_batch_mutation_wal_record(...)~231DELETEBatch WAL append; dead post-step-1 (overlay uses singleton WAL appends)

11. src/persistent_artrie/overlay_checkpoint.rs

STATUS: DELETE next_lsn_at_capture field (BLOCKER#4 already uses committed watermark)

SymbolLinesVerdictReason
pub(crate) struct CheckpointSnapshot { next_lsn_at_capture: u64, ... }line 64DELETE fieldPer design §4 BLOCKER#4, use committed_checkpoint_lsn, not next_lsn_at_capture

Ripple Check: Char has separate CheckpointSnapshot in persistent_artrie_char/persist.rs — byte deletion does NOT affect char.

KEEP:

  • pub(super) fn serialize_root_value_bytes(...) | 1297 | KEEP | Called by overlay checkpoint path

12. src/persistent_artrie/cursor_iter.rs

STATUS: DELETE owned cursor collectors

SymbolLinesVerdictReason
pub(super) fn collect_terms_from_cursor(...)~76DELETECollects from owned cursor; unused post-step-1
pub(super) fn collect_terms_with_cursor_and_arena(...)~76DELETECollects from cursor + arena; unused post-step-1

13. src/persistent_artrie/overlay_fault.rs (17136 bytes)

STATUS: KEEP; these are test/bench helpers used by char tests

SymbolLinesVerdictReason
pub(crate) fn bench_enable_eviction(...)277–303KEEPCalled by persistent_artrie_char/overlay_dictionary_node_faulting_tests.rs and other char eviction tests
pub(crate) fn bench_immutable_checkpoint_with_eviction()325–327KEEPCalled by char overlay tests
pub(crate) fn evictable_node_count()334–340KEEPCalled by char overlay tests
pub(crate) fn evict_overlay_nodes(...)224–276KEEPBatch eviction driver; used by benches
pub(crate) fn load_overlay_node_from_disk(...)49–155KEEPOverlay loader; LIVE caller in overlay_checkpoint + lockfree_cas

14. src/persistent_artrie/lockfree_cas.rs (1500+ lines)

STATUS: DELETE owned merge helpers (COLLAPSE step 1 already removed callers); KEEP overlay merge

SymbolLinesVerdictReason
Owned merge helpers (if any named ..._owned or called from deleted paths)~1440DELETEDead post-step-1 collapse of shared_trait_impl insert/remove tails

Compiler check: After deleting shared_trait_impl owned tails + parallel_merge collapse, check for remaining owned-only callers in lockfree_cas.


15. src/persistent_artrie/parallel_merge.rs

STATUS: COLLAPSE (NOT DELETE); replace owned insert_impl with overlay merge path

CurrentLinesActionReplacement
Line ~166: guard.insert_impl(&term, Some(value))166COLLAPSEReplace with overlay merge helper call (find merge_entries_overlay or equivalent)

Mirror: Char already collapsed parallel_merge to overlay path (per design §2 step-1).

Find replacement: Search for char parallel_merge overlay merge path (persistent_artrie_char/parallel_merge.rs), then apply same pattern to byte.


16. src/persistent_artrie/overlay_write_mode.rs (82 lines)

STATUS: DELETE dead stubs/arms (already collapsed in L3.3a per design §0.4)

SymbolVerdictReason
Dead match arms / owned-regime stubsDELETEOwned arms already collapsed in earlier L3.3a work

Compiler will flag any remaining references to OverlayWriteMode variants that were already removed.


17. src/persistent_artrie/arena_iter.rs

STATUS: DELETE inline owned-tail reads on self.root

SymbolVerdictReason
Owned tails reading self.rootDELETEInline reads from deleted field; collapse to overlay-only paths

18. src/persistent_artrie/mmap_ctor.rs + src/persistent_artrie/io_uring_ctor.rs

STATUS: BLOCKER#4 fallback-port (C1 commit, BEFORE owned deletion)

See separate design document: docs/design/slice3-l33c-execution-plan-2026-06-09.md §4.


19. src/persistent_artrie/shared_trait_impl.rs

STATUS: COLLAPSE step 1 (owned tails already dead; early return <overlay> makes owned tail unreachable)

SymbolVerdictAction
insert method owned tailCOLLAPSEDelete owned tail only; overlay early return stays
insert_with_value method owned tailCOLLAPSEDelete owned tail only
remove method owned tailCOLLAPSEDelete owned tail only
remove_prefix method owned tailCOLLAPSEDelete owned tail only

20. src/persistent_artrie/atomic_ops.rs

STATUS: COLLAPSE step 1 (owned tails already dead)

SymbolVerdictAction
get_value_bytes owned tailCOLLAPSEDelete owned tail only; overlay early return stays
unrouted_* shims owned tailsCOLLAPSEDelete owned tails only

TRAP (§8.2): Char try_increment_impl_no_wal at line 159 is LIVE (still needed for recovery replay). Do NOT delete char's version.


21. src/persistent_artrie/lockfree_cas.rs — line ~1476

STATUS: COLLAPSE step 1

SymbolLinesVerdictReason
Owned tail at line 14761476COLLAPSEDelete owned tail only; overlay path stays

UNSAFE BOUNDARY (Formal Verification)

Byte UNSAFE delta = ZERO

Verification:

  1. Check formal-verification/UNSAFE_INVENTORY.tsv for any rows tagged byte-*-owned-* or similar
  2. Byte owned code has zero unsafe blocks tracked; all byte unsafe blocks are in:
    • Row 1-3: SwizzledPtr operations (KEEP)
    • Row 17-18: Send/Sync (KEEP)
    • Row 21: (KEEP)
    • Row 22-30: Overlay fault-in / inner_to_overlay (KEEP — these are not byte-specific, used by char too)

Conclusion: Deleting byte owned cluster removes zero tracked unsafe blocks. No row pruning needed for byte. Set-equality gate in UNSAFE_INVENTORY.tsv + UNSAFE_CONTRACTS.tsv requires NO changes for byte.


BLOCKER#4 — Fallback-Port (C1 COMMIT, BEFORE C2)

See: docs/design/slice3-l33c-execution-plan-2026-06-09.md §4.

Applies to: src/persistent_artrie/f5_loader.rs, mmap_ctor.rs, io_uring_ctor.rs (C1 only, NOT in C2 deletion scope).

C1 Change Summary:

  • load_root_immutable(f5_loader.rs:60): Result → Result<(usize, bool)> (bool = image_loaded)
  • Delete eager pre-load loop in mmap_ctor/io_uring_ctor
  • Replace was_loaded_from_disk=loaded_root.is_some() with root_ptr!=0 check
  • Compute effective_loaded = (root_ptr!=0) && image_loaded

COMMIT STRATEGY

C1 (REVERSIBLE, FIRST)

Scope: BLOCKER#4 fallback-port only (§4)
Files: f5_loader.rs, mmap_ctor.rs, io_uring_ctor.rs
Behavior: Preserve-equivalent, de-risk keystone by proving codec-only reopen path works

C2 (IRREVERSIBLE, ATOMIC, THIS MAP)

Scope: Entire owned-tree deletion cluster (§1–§22, above)
Files: All 17+ files listed above
Atomicity: All deletions in ONE commit (cluster is self-referential + entangled with TrieRoot + UNSAFE set-equality)
Gate: Run full test suite + cargo check --all-features; verify NO orphaned symbols remain (compiler dead-code warnings must be resolved)


POST-C2 VERIFICATION CHECKLIST

  • [ ] cargo check --all-features returns ZERO new compiler errors/warnings related to owned code
  • [ ] All use super::transitions::ChildNode imports succeed (ChildNode still exists)
  • [ ] All use super::nodes::{...} imports succeed (Node/ArtNode types still exist for overlay)
  • [ ] enumerate_terms_from_disk + decode surface compile without orphaned references
  • [ ] Byte overlay_fault functions (bench_enable_eviction, etc.) remain and compile
  • [ ] load_overlay_node_from_disk compiles (KEEP, used by lockfree_cas + checkpoint)
  • [ ] Formal-verification gate: UNSAFE_INVENTORY.tsv + UNSAFE_CONTRACTS.tsv SET-EQUALITY passes (zero byte rows removed)
  • [ ] Run persistent_artrie_recovery_tests.rs::byte_invalid_root_descriptor_replays_wal_without_checkpoint_skip (confirms BLOCKER#4 fallback works)
  • [ ] Run full suite: cargo test --all-features --lib persistent_artrie (2700+ test count must pass)

SUMMARY TABLE: FILES & LINES

FileTotal LinesStatusDeletionsKeepers
mutation_core.rs448DELETE44–413 (all)
transitions.rs~900PARTIAL48–294, 503–761ChildNode decode, Overlay variants
node_impl.rs~400PARTIALBucketPosition, NodeInner::{ArtNode, Bucket, Root, Empty}, new_root*, new_art_node*, new_bucketPersistentARTrieNode, NodeInner::Overlay, new_overlay, overlay_child_node
dict_impl.rs~2000PARTIAL464–479 (TrieRoot), 280 (root field), 345 (dirty_prefixes), 505–520 (get_root_node), 1874–1970 (owned readers)Overlay-only struct definition, overlay field in PersistentARTrie
dirty_tracking.rs158DELETEAll 9 public/private functions (42–157)
disk_load.rs1164PARTIAL89–846 (owned loaders)enumerate_terms_from_disk, decode surface
bucket.rs~500PARTIALinsert, insert_key, split* (when orphaned)from_bytes, len, get_entry, get_suffix, get_value, search, contains, iter, as_bytes, header
path_compression.rs(varies)VERIFYcommon_prefix_len, make_common_prefix (if not used by CX codec)
serialize_impl.rs(varies)DELETEserialize_node_to_disk (~57)serialize_node_to_disk_with_value_len
persistence_api.rs(varies)DELETEappend_batch_mutation_wal_record (~231)
overlay_checkpoint.rs(varies)PARTIALnext_lsn_at_capture field (64)serialize_root_value_bytes
cursor_iter.rs(varies)DELETEcollect_terms_from_cursor, collect_terms_with_cursor_and_arena (~76)
overlay_fault.rs17136KEEPbench_enable_eviction, bench_immutable_checkpoint_with_eviction, evictable_node_count, evict_overlay_nodes, load_overlay_node_from_disk
lockfree_cas.rs1500+PARTIALowned merge helpers (~1440)overlay merge helpers
parallel_merge.rs(varies)COLLAPSELine 166: insert_impl owned tailReplace with overlay merge
overlay_write_mode.rs82DELETEdead stubs/arms
arena_iter.rs(varies)COLLAPSEself.root reads (owned tails)
shared_trait_impl.rs(varies)COLLAPSEinsert/insert_with_value/remove/remove_prefix owned tailsOverlay early returns
atomic_ops.rs(varies)COLLAPSEget_value_bytes, unrouted_* owned tailsOverlay early returns
mmap_ctor.rs(varies)C1 only(BLOCKER#4 fallback-port)
io_uring_ctor.rs(varies)C1 only(BLOCKER#4 fallback-port)

REMAINING BLOCKERS / OPEN QUESTIONS

  1. path_compression.rs: Confirm whether CX codec uses common_prefix_len / make_common_prefix. If not, DELETE entire file.
  2. bucket.rs write surface: Compiler will flag orphaned insert_key / insert / split calls. Delete when confirmed.
  3. parallel_merge collapse: Identify exact overlay merge path from char variant; apply to byte line 166.
  4. overlay_checkpoint CheckpointSnapshot.next_lsn_at_capture: Confirm char has separate struct (it does per grep); deletion ripples only to byte overlay_checkpoint impl.

APPENDIX: Additional Verification Notes

CheckpointSnapshot Field Ripple

Confirmed: Byte and char have SEPARATE CheckpointSnapshot structs:

  • Byte: src/persistent_artrie/overlay_checkpoint.rs:52
  • Char: src/persistent_artrie_char/persist.rs (separate)

Deleting byte's CheckpointSnapshot.next_lsn_at_capture field does NOT affect char.

overlay_fault.rs Bench Functions ARE LIVE

Grep confirmed callers in char eviction tests:

  • persistent_artrie_char/overlay_dictionary_node_faulting_tests.rs
  • persistent_artrie_char/overlay_eviction_driver_correspondence.rs

Functions bench_enable_eviction, bench_immutable_checkpoint_with_eviction, evictable_node_count are CALLED by char tests and MUST be kept in byte module.

Dirty Tracking Cleanup

dirty_tracking.rs module (158 lines) is ENTIRELY owned-mutation specific:

  • All 9 functions marked F4 = owned-only
  • All functions access deleted self.root OR self.dirty_prefixes field
  • No overlay or overlay-checkpoint caller exists
  • Safe to delete entire file

Parallel Merge Collapse Detail

Line 166 in parallel_merge.rs calls insert_impl on owned shared_trait_impl. The char variant already uses overlay merge path (need to check persistent_artrie_char/parallel_merge.rs for exact pattern).

Byte UNSAFE Cleanliness Confirmation

Byte owns zero unsafe blocks that are part of owned code:

  • All byte unsafe = SwizzledPtr, Send/Sync, or Overlay faulting
  • None are in mutation_core, transitions owned write, or node_impl owned variants
  • Deletion removes zero unsafe blocks from UNSAFE_INVENTORY.tsv
  • Set-equality gate will pass unchanged

Can you improve this documentation?Edit on GitHub

cljdoc builds & hosts documentation for Clojure/Script libraries

Keyboard shortcuts
Ctrl+kJump to recent docs
Move to previous article
Move to next article
Ctrl+/Jump to the search field
× close