1use std::hash::Hash;
4
5use variadics::variadic_collections::VariadicCollection;
6use variadics::{PartialEqVariadic, SplitBySuffix, VariadicExt, var_expr, var_type};
7
8use crate::ght::{GeneralizedHashTrieNode, GhtGet, GhtInner, GhtLeaf};
9
10pub trait ColtForestNode: GeneralizedHashTrieNode {
25 type Force: GeneralizedHashTrieNode;
27
28 fn force(self) -> Option<Self::Force>;
31
32 fn force_drain(&mut self) -> Option<Self::Force>;
34}
35
36impl<Head, Node> ColtForestNode for GhtInner<Head, Node>
38where
39 Head: 'static + Hash + Eq + Clone,
40 Node: 'static + ColtForestNode,
41 <Node as GeneralizedHashTrieNode>::Schema:
42 SplitBySuffix<var_type!(Head, ...<Node as GeneralizedHashTrieNode>::SuffixSchema)>,
43{
44 type Force = Node; fn force(self) -> Option<Self::Force> {
46 None
47 }
48
49 fn force_drain(&mut self) -> Option<Self::Force> {
50 None
51 }
52}
53
54impl<Schema, Head, Rest, Storage> ColtForestNode
56 for GhtLeaf<Schema, var_type!(Head, ...Rest), Storage>
57where
58 Head: 'static + Clone + Hash + Eq,
59 Rest: 'static + Clone + Hash + Eq + VariadicExt + PartialEqVariadic,
60 Schema: 'static
61 + Hash
62 + Eq
63 + Clone
64 + VariadicExt
65 + PartialEqVariadic
66 + SplitBySuffix<var_type!(Head, ...Rest)>
67 + SplitBySuffix<Rest>,
68 <Schema as SplitBySuffix<(Head, Rest)>>::Prefix: Eq + Hash + Clone,
69 <Schema as SplitBySuffix<Rest>>::Prefix: Eq + Hash + Clone,
70 Storage: VariadicCollection<Schema = Schema> + Default + IntoIterator<Item = Schema>,
71 GhtLeaf<Schema, Rest, Storage>: GeneralizedHashTrieNode<Schema = Schema, Storage = Storage>,
72 GhtInner<Head, GhtLeaf<Schema, Rest, Storage>>:
73 GeneralizedHashTrieNode<Schema = Schema, Storage = Storage>,
74{
75 type Force = GhtInner<Head, GhtLeaf<Schema, Rest, Storage>>;
76 fn force(mut self) -> Option<Self::Force> {
77 let mut retval = Self::Force::default();
78 self.forced = true;
79 for row in self.into_iter().unwrap() {
80 retval.insert(row);
81 }
82 Some(retval)
83 }
84
85 fn force_drain(&mut self) -> Option<GhtInner<Head, GhtLeaf<Schema, Rest, Storage>>> {
86 let mut retval = Self::Force::default();
87 self.forced = true;
88 for row in self.elements.drain() {
89 retval.insert(row);
90 }
91 Some(retval)
92 }
93}
94
95pub trait ColtGet {
103 type Schema: VariadicExt + Eq + Hash + Clone;
106 type Storage: VariadicCollection;
109 type SuffixSchema: VariadicExt + Eq + Hash + Clone;
113 type Head: Eq + Hash;
116
117 type Get;
119
120 fn get(self, head: &Self::Head) -> Self::Get;
125
126 fn iter(&self) -> impl Iterator<Item = Self::Head>;
128}
129
130pub trait ColtGetTail<InnerToMerge>: ColtGet {
132 fn merge(&mut self, inner_to_merge: InnerToMerge);
134}
135
136impl<'a, Rest, Schema, SuffixSchema, Storage> ColtGet for var_type!(&'a mut GhtLeaf<Schema, SuffixSchema, Storage>, ...Rest)
137where
138 Rest: ColtGetTail<
139 <GhtLeaf<Schema, SuffixSchema, Storage> as ColtForestNode>::Force,
140 Storage = Storage,
141 >,
142 <Rest as ColtGet>::SuffixSchema: 'a,
143 GhtLeaf<Schema, SuffixSchema, Storage>: ColtForestNode,
144 Schema: Clone + Hash + Eq + VariadicExt,
145 SuffixSchema: Clone + Hash + Eq + VariadicExt,
146 Storage: VariadicCollection<Schema = Schema>,
147{
148 type Schema = Schema;
149 type Head = Rest::Head;
150 type SuffixSchema = SuffixSchema;
151 type Get = Rest::Get;
152 type Storage = Rest::Storage;
153
154 fn get(self, head: &Self::Head) -> Self::Get {
155 let (first, mut rest) = self;
156 let forced = first.force_drain().unwrap();
157 ColtGetTail::merge(&mut rest, forced);
158 Rest::get(rest, head)
159 }
160
161 fn iter(&self) -> impl Iterator<Item = Self::Head> {
162 std::iter::empty()
163 }
164}
165
166impl<'a, Rest, Schema, SuffixSchema, T, Storage> ColtGetTail<T> for var_type!(&'a mut GhtLeaf<Schema, SuffixSchema, Storage>, ...Rest)
169where
170 Rest: ColtGetTail<
171 <GhtLeaf<Schema, SuffixSchema, Storage> as ColtForestNode>::Force,
172 Storage = Storage,
173 >,
174 <Rest as ColtGet>::SuffixSchema: 'a,
175 GhtLeaf<Schema, SuffixSchema, Storage>: ColtForestNode,
176 Schema: Clone + Hash + Eq + VariadicExt,
177 SuffixSchema: Clone + Hash + Eq + VariadicExt,
178 Storage: VariadicCollection<Schema = Schema>,
179{
180 fn merge(&mut self, _inner_to_merge: T) {
181 panic!();
182 }
183}
184
185impl<'a, Head, Head2, Rest, Node> ColtGet for var_type!(&'a mut GhtInner<Head, GhtInner<Head2, Node>>, ...Rest)
186where
187 Rest: ColtGet<Head = Head>,
188 Head: Eq + Hash + Clone,
189 Head2: Eq + Hash + Clone,
190 Node: GeneralizedHashTrieNode,
191 GhtInner<Head, GhtInner<Head2, Node>>: GeneralizedHashTrieNode<
192 Head = Rest::Head,
193 SuffixSchema = Rest::SuffixSchema,
194 Schema = Rest::Schema,
195 Storage = Rest::Storage,
196 >,
197 GhtInner<Head2, Node>: GeneralizedHashTrieNode<Schema = Rest::Schema, Storage = Rest::Storage>,
198{
199 type Schema = Rest::Schema;
200 type Head = Rest::Head;
201 type SuffixSchema = Rest::SuffixSchema;
202 type Get = var_type!(&'a mut GhtInner<Head2, Node>, ...Rest::Get);
203 type Storage = Rest::Storage;
204
205 fn get(self, head: &Self::Head) -> Self::Get {
206 let (first, rest) = self;
207 let child = first.children.entry(head.clone()).or_default();
210 var_expr!(child, ...Rest::get(rest, head))
211 }
212
213 fn iter(&self) -> impl Iterator<Item = Self::Head> {
214 #[expect(
215 clippy::disallowed_methods,
216 reason = "nondeterministic iteration order, TODO(mingwei)"
217 )]
218 self.0.children.keys().cloned().chain(Rest::iter(&self.1))
219 }
220}
221
222impl<'a, Head, Rest, Schema, ValType, Storage> ColtGet for var_type!(&'a mut GhtInner<Head, GhtLeaf<Schema, ValType, Storage>>, ...Rest)
223where
224 Rest: ColtGet<Head = Head>,
225 Head: Eq + Hash + Clone,
226 Schema: 'static + Eq + VariadicExt + Hash + Clone + SplitBySuffix<ValType> + PartialEqVariadic,
227 ValType: Eq + Hash + Clone + PartialEqVariadic,
228 Storage: VariadicCollection<Schema = Schema>,
229 <Schema as SplitBySuffix<ValType>>::Prefix: Eq + Hash + Clone,
230 GhtInner<Head, GhtLeaf<Schema, ValType, Storage>>: GeneralizedHashTrieNode<Head = Head>
231 + GeneralizedHashTrieNode<Head = Rest::Head, Schema = Rest::Schema, Storage = Rest::Storage>
232 + GhtGet,
233 GhtLeaf<Schema, ValType, Storage>:
234 GeneralizedHashTrieNode<Schema = Rest::Schema, Storage = Rest::Storage> + GhtGet,
235{
236 type Schema = Rest::Schema;
237 type Head = Rest::Head;
238 type SuffixSchema = Rest::SuffixSchema;
239 type Get = var_type!(&'a mut GhtLeaf<Schema, ValType, Storage>, ...Rest::Get);
240 type Storage = Rest::Storage;
241
242 fn get(self, head: &Self::Head) -> Self::Get {
243 let (first, rest) = self;
244 let child = first.children.entry(head.clone()).or_default();
245 var_expr!(child, ...Rest::get(rest, head))
246 }
247
248 fn iter(&self) -> impl Iterator<Item = Self::Head> {
249 #[expect(
250 clippy::disallowed_methods,
251 reason = "nondeterministic iteration order, TODO(mingwei)"
252 )]
253 self.0.children.keys().cloned().chain(Rest::iter(&self.1))
254 }
255}
256
257impl<'a, Head, Rest, Schema, ValType, Storage>
258 ColtGetTail<GhtInner<Head, GhtLeaf<Schema, ValType, Storage>>> for var_type!(&'a mut GhtInner<Head, GhtLeaf<Schema, ValType, Storage>>, ...Rest)
259where
260 Rest: ColtGet<Head = Head, Schema = Schema, Storage = Storage>,
261 Head: Eq + Hash + Clone,
262 Schema: Eq + Hash + Clone + PartialEqVariadic,
263 ValType: Eq + Hash + Clone + PartialEqVariadic,
264 Storage: VariadicCollection<Schema = Schema>,
265 var_type!(&'a mut GhtInner<Head, GhtLeaf<Schema, ValType, Storage>>, ...Rest):
266 ColtGet<Head = Head, Schema = Schema, Storage = Storage>,
267 GhtLeaf<Schema, ValType, Storage>: GeneralizedHashTrieNode<Schema = Schema>,
268 Schema: 'static + Eq + VariadicExt + Hash + Clone + SplitBySuffix<ValType> + PartialEqVariadic,
269 <Schema as SplitBySuffix<ValType>>::Prefix: Eq + Hash + Clone,
270 GhtInner<Head, GhtLeaf<Schema, ValType, Storage>>:
271 GeneralizedHashTrieNode<Head = Head, Schema = Schema, Storage = Storage> + GhtGet,
272{
273 fn merge(&mut self, inner_to_merge: GhtInner<Head, GhtLeaf<Schema, ValType, Storage>>) {
274 let (head, _rest) = self;
275 head.merge_node(inner_to_merge);
277 }
278}
279
280impl<'a, Head, Node> ColtGet for var_type!(&'a mut GhtInner<Head, Node>)
281where
282 GhtInner<Head, Node>: GeneralizedHashTrieNode,
283 Head: Clone + Eq + Hash,
284 Node: GeneralizedHashTrieNode,
285{
286 type Schema = <GhtInner<Head, Node> as GeneralizedHashTrieNode>::Schema;
287 type SuffixSchema = <GhtInner<Head, Node> as GeneralizedHashTrieNode>::SuffixSchema;
288 type Head = Head;
289 type Get = var_type!(&'a mut Node);
290 type Storage = Node::Storage;
291
292 fn get(self, head: &Self::Head) -> Self::Get {
293 let child = self.0.children.entry(head.clone()).or_default();
294 var_expr!(child)
295 }
296
297 fn iter(&self) -> impl Iterator<Item = Self::Head> {
298 #[expect(
299 clippy::disallowed_methods,
300 reason = "nondeterministic iteration order, TODO(mingwei)"
301 )]
302 self.0.children.keys().cloned()
303 }
304}
305impl<Head, Schema, ValType, Storage> ColtGetTail<GhtInner<Head, GhtLeaf<Schema, ValType, Storage>>> for var_type!(&mut GhtInner<Head, GhtLeaf<Schema, ValType, Storage>>)
306where
307 GhtInner<Head, GhtLeaf<Schema, ValType, Storage>>:
308 GeneralizedHashTrieNode<Head = Head> + GhtGet,
309 GhtLeaf<Schema, ValType, Storage>: GeneralizedHashTrieNode<Schema = Schema, Storage = Storage>,
310 Head: Clone + Eq + Hash,
311 Schema: Clone + Eq + Hash + VariadicExt,
312 Storage: VariadicCollection<Schema = Schema>,
313{
314 fn merge(&mut self, inner_to_merge: GhtInner<Head, GhtLeaf<Schema, ValType, Storage>>) {
315 let (head, _rest) = self;
316 head.merge_node(inner_to_merge);
318 }
319}