From 1f00c72a0093aa733fc4feaf0f9cf86116f6bc46 Mon Sep 17 00:00:00 2001 From: Joe Hellerstein Date: Mon, 9 Sep 2024 15:55:09 -0400 Subject: [PATCH] WIP get seems ok --- lattices/src/ght_lazy.rs | 42 +++++++++++++++++++++++++++++++++++++--- lattices/src/ght_test.rs | 18 +++-------------- 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/lattices/src/ght_lazy.rs b/lattices/src/ght_lazy.rs index d7515046c4e8..3fbe60d2810f 100644 --- a/lattices/src/ght_lazy.rs +++ b/lattices/src/ght_lazy.rs @@ -399,21 +399,24 @@ where } #[sealed] -impl<'a, Head, Rest, Node> ColtNode for var_type!(Option<&'a GhtInner>, ...Rest) +impl<'a, Head, Head2, Rest, Node> ColtNode for var_type!(Option<&'a GhtInner>>, ...Rest) where Rest: ColtNode, Head: Eq + Hash + Clone, + Head2: Eq + Hash + Clone, Node: GeneralizedHashTrieNode, - GhtInner: GeneralizedHashTrieNode< + GhtInner>: GeneralizedHashTrieNode< Head = Rest::Head, SuffixSchema = Rest::SuffixSchema, Schema = Rest::Schema, > + GhtGet, + GhtInner: GeneralizedHashTrieNode + GhtGet, { type Schema = Rest::Schema; type Head = Rest::Head; type SuffixSchema = Rest::SuffixSchema; - type Get = var_type!(Option<&'a as GhtGet>::Get>, ...Rest::Get); + type Get = + var_type!(Option<&'a > as GhtGet>::Get>, ...Rest::Get); fn get(&self, head: &GhtKey) -> Self::Get { let (_first, rest) = self; @@ -424,6 +427,39 @@ where } } } +#[sealed] +impl<'a, Head, Rest, Schema, ValType> ColtNode for var_type!(Option<&'a GhtInner>>, ...Rest) +where + Rest: ColtNode, + Head: Eq + Hash + Clone, + // GhtInner>: GeneralizedHashTrieNode< + // Head = Rest::Head, + // SuffixSchema = Rest::SuffixSchema, + // Schema = Rest::Schema, + // > + GhtGet, + // GhtInner: GeneralizedHashTrieNode + GhtGet, + Schema: Eq + Hash + Clone + PartialEqVariadic, + ValType: Eq + Hash + Clone + PartialEqVariadic, + GhtLeaf: GeneralizedHashTrieNode, + Schema: 'static + Eq + VariadicExt + Hash + Clone + SplitBySuffix + PartialEqVariadic, + >::Prefix: Eq + Hash + Clone, +{ + type Schema = Rest::Schema; + type Head = Rest::Head; + type SuffixSchema = Rest::SuffixSchema; + type Get = Rest::Get; // Option<&'a as GhtGet>::Get>, + + fn get(&self, head: &GhtKey) -> Self::Get { + let (_first, rest) = self; + Rest::get(rest, head) + // let (_first, rest) = self; + // if let Some(first) = self.0 { + // var_expr!(first.get(head), ...Rest::get(rest, head)) + // } else { + // var_expr!(None, ...Rest::get(rest, head)) + // } + } +} #[sealed] impl<'a, Head, Node> ColtNode for var_type!(Option<&'a GhtInner>) diff --git a/lattices/src/ght_test.rs b/lattices/src/ght_test.rs index 4f46be563d2e..efa9a3816af5 100644 --- a/lattices/src/ght_test.rs +++ b/lattices/src/ght_test.rs @@ -1086,22 +1086,10 @@ mod test { // println!("Forest after forcing (1, 1, 1, 1): {:?}", forest); let get_result = ColtNode::get(&forest.as_ref_var().as_option(), &GhtKey::Head(1)); - assert_eq!(get_result.len(), forest.len()); - assert!(get_result.0.is_none()); + assert_eq!(get_result.len(), forest.len() - 1); let get_result2 = ColtNode::get(&get_result, &GhtKey::Head(1)); - assert_eq!(get_result2.len(), forest.len()); - assert!(get_result2.0.is_none()); - assert!(get_result2.1 .0.is_none()); - // // fix up get_result2. Eventually this should be automated - // let (_head2, rest2) = get_result2; - // let (rest_head2, _rest_tail2) = rest2; - // let mut new_head2 = rest_head2; - // new_head2 = None; - // let get_result2 = var_expr!(new_head2, ...rest2); + assert_eq!(get_result2.len(), forest.len() - 2); let get_result3 = ColtNode::get(&get_result2, &GhtKey::Head(1)); - assert_eq!(get_result3.len(), forest.len()); - assert!(get_result3.0.is_none()); - assert!(get_result3.1 .0.is_none()); - assert!(get_result3.1 .1 .0.is_none()); + assert_eq!(get_result3.len(), forest.len() - 3); } }