1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
//! Core trait definitions for Prolly tree operations
//!
//! This module defines internal traits used for organizing the implementation.
//! These traits are designed for future extensibility, allowing alternative
//! implementations of key tree operations.
//!
//! # Overview
//!
//! Currently, the public API is the concrete `Prolly<S>` struct. These traits
//! are not exposed publicly but provide a foundation for:
//!
//! - Custom rebalancing strategies (e.g., different chunking algorithms)
//! - Alternative batch mutation implementations
//! - Different diff/merge algorithms (e.g., streaming vs. collecting)
//!
//! # Design Philosophy
//!
//! The traits follow a composition-based design where the `Prolly<S>` struct
//! delegates to specialized modules. This separation enables:
//!
//! - **Independent testing**: Each component can be tested in isolation
//! - **Future swapping**: Implementations can be changed without affecting the API
//! - **Clear boundaries**: Responsibilities are well-defined and documented
//!
//! # Trait Hierarchy
//!
//! ## TreeRebalancer
//!
//! Handles node splitting and merging to maintain tree balance. The default
//! implementation uses content-defined chunking with probabilistic boundaries.
//!
//! ## BatchMutator
//!
//! Handles bulk modifications with atomic writes. The default implementation
//! uses last-write-wins semantics and groups mutations by target leaf.
//!
//! ## TreeDiffer
//!
//! Handles computing differences and performing merges. The default implementation
//! uses a simple comparison-based approach with pluggable conflict resolvers.
//!
//! # Future Extensibility
//!
//! These traits are currently internal, but could be exposed publicly in the
//! future to allow users to provide custom implementations. For example:
//!
//! - A `StreamingDiffer` that yields differences lazily
//! - A `ParallelRebalancer` that uses multiple threads
//! - A `ConflictFreeMerger` for CRDT-style merging
// Allow dead_code since these traits are defined for future extensibility
use Cid;
use ;
use Node;
use Store;
use Tree;
use BatchWriteCollector;
/// Trait for tree rebalancing operations.
///
/// Rebalancing ensures that tree nodes stay within configured size bounds
/// after insertions and deletions. This trait abstracts the rebalancing
/// strategy, allowing for alternative implementations.
///
/// # Responsibilities
/// - Splitting oversized nodes
/// - Merging undersized nodes with siblings
/// - Propagating changes up the tree
/// - Maintaining tree balance invariants
///
/// # Default Implementation
/// The default implementation uses content-defined chunking with
/// probabilistic boundaries for deterministic tree structure.
/// Trait for batch mutation operations.
///
/// Batch mutations enable efficient bulk modifications to a tree by:
/// - Sorting and deduplicating mutations
/// - Grouping mutations by target leaf
/// - Applying all changes atomically
///
/// # Responsibilities
/// - Preprocessing mutations (sort, deduplicate)
/// - Grouping mutations by affected leaf
/// - Coordinating atomic writes
///
/// # Default Implementation
/// The default implementation uses last-write-wins semantics for
/// duplicate keys and writes all modified nodes atomically.
/// Trait for diff and merge operations.
///
/// Diff operations compute the differences between two trees, while
/// merge operations combine changes from divergent branches.
///
/// # Responsibilities
/// - Computing tree differences (Added, Removed, Changed)
/// - Three-way merge with conflict detection
/// - Conflict resolution via resolver functions
///
/// # Default Implementation
/// The default implementation uses a simple comparison-based diff
/// and supports pluggable conflict resolvers for merge operations.