Diffstat (limited to 'src/walk/walkers/core/struct.rs')
| -rw-r--r-- | src/walk/walkers/core/struct.rs | 167 |
1 files changed, 79 insertions, 88 deletions
diff --git a/src/walk/walkers/core/struct.rs b/src/walk/walkers/core/struct.rs index a7d7e88..5ffb224 100644 --- a/src/walk/walkers/core/struct.rs +++ b/src/walk/walkers/core/struct.rs @@ -1,7 +1,7 @@ use core::{any::TypeId, marker::PhantomData}; use crate::{ - any::static_wrapper::BorrowedStatic, + any::static_wrapper::{BorrowedStatic, DynBorrowedStatic}, any_trait, effect::{Effect, Future}, never::Never, @@ -135,33 +135,32 @@ where } any_trait! { - impl['a, 'ctx, T, I, M, E] StructWalker<'ctx, T, I, M, E> = [ - DynHint<'a, 'ctx, DynRecoverable<'a, 'ctx, E>, E>, - DynHint<'a, 'ctx, DynSequence<'a, 'ctx, E>, E>, - DynHint<'a, 'ctx, DynValue<'a, 'ctx, BorrowedStatic<'ctx, T>, E>, E>, - DynHint<'a, 'ctx, DynTag<'a, 'ctx, TagDyn, E>, E>, - DynHint<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E>, E>, - DynHint<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E>, E>, - DynHint<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_MAP.to_int() }>, E>, E>, - DynHint<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E>, E>, - DynHint<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E>, E>, + impl['ctx, T, I, M, E] StructWalker<'ctx, T, I, M, E> = [ + DynHint<'ctx, DynRecoverable<'ctx, E>, E>, + DynHint<'ctx, DynSequence<'ctx, E>, E>, + DynHint<'ctx, DynValue<'ctx, DynBorrowedStatic<'ctx, T>, E>, E>, + DynHint<'ctx, DynTag<'ctx, TagDyn, E>, E>, + DynHint<'ctx, DynTag<'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E>, E>, + DynHint<'ctx, DynTag<'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E>, E>, + DynHint<'ctx, DynTag<'ctx, TagConst<{ TAG_MAP.to_int() }>, E>, E>, + DynHint<'ctx, DynTag<'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E>, E>, + DynHint<'ctx, DynTag<'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E>, E>, ] where E: Effect<'ctx>, T: Sync + 'static, I: StructTypeInfo<'ctx, M, T = T> } -impl<'a, 'ctx: 'a, T, I, M, E> Hint<'a, 'ctx, DynRecoverable<'a, 'ctx, E>, E> - for StructWalker<'ctx, T, I, M, E> +impl<'ctx, T, I, M, E> Hint<'ctx, DynRecoverable<'ctx, E>, E> for StructWalker<'ctx, T, I, M, E> where E: Effect<'ctx>, I: StructTypeInfo<'ctx, M, T = T>, T: Sync + 'static, { - fn hint( + fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <DynRecoverable<'a, 'ctx, E> as HintMeta<'ctx>>::Hint, + _hint: <DynRecoverable<'ctx, E> as HintMeta<'ctx>>::Hint, ) -> Future<'a, 'ctx, Flow, E> { E::map( visit_recoverable::<E>(visitor, self), @@ -172,26 +171,25 @@ where ) } - fn known( + fn known<'a>( &'a mut self, - _hint: &'a <DynRecoverable<'a, 'ctx, E> as HintMeta<'ctx>>::Hint, - ) -> Future<'a, 'ctx, Result<Known<'a, 'ctx, DynRecoverable<'a, 'ctx, E>>, ()>, E> { + _hint: &'a <DynRecoverable<'ctx, E> as HintMeta<'ctx>>::Hint, + ) -> Future<'a, 'ctx, Result<Known<'a, 'ctx, DynRecoverable<'ctx, E>>, ()>, E> { E::ready(Ok(())) } } -impl<'a, 'ctx: 'a, T, I, M, E> - Hint<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E>, E> +impl<'ctx, T, I, M, E> Hint<'ctx, DynTag<'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E>, E> for StructWalker<'ctx, T, I, M, E> where E: Effect<'ctx>, I: StructTypeInfo<'ctx, M>, T: Sync + 'static, { - fn hint( + fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <DynTag<'a, 'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: <DynTag<'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E> as HintMeta<'ctx>>::Hint, ) -> Future<'a, 'ctx, Flow, E> { E::map( visit_tag::<TagConst<{ TAG_FIELD_NAMES.to_int() }>, E, _>( @@ -210,15 +208,15 @@ where ) } - fn known( + fn known<'a>( &'a mut self, - _hint: &'a <DynTag<'a, 'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E> as HintMeta< + _hint: &'a <DynTag<'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E> as HintMeta< 'ctx, >>::Hint, ) -> Future< 'a, 'ctx, - Result<Known<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E>>, ()>, + Result<Known<'a, 'ctx, DynTag<'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E>>, ()>, E, > { E::ready(Ok(TagKnown { @@ -227,18 +225,17 @@ where } } -impl<'a, 'ctx: 'a, T, I, M, E> - Hint<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E>, E> +impl<'ctx, T, I, M, E> Hint<'ctx, DynTag<'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E>, E> for StructWalker<'ctx, T, I, M, E> where E: Effect<'ctx>, I: StructTypeInfo<'ctx, M>, T: Sync + 'static, { - fn hint( + fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: <DynTag<'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E> as HintMeta<'ctx>>::Hint, ) -> Future<'a, 'ctx, Flow, E> { E::map( visit_tag::<TagConst<{ TAG_TYPE_NAME.to_int() }>, E, _>( @@ -257,13 +254,13 @@ where ) } - fn known( + fn known<'a>( &'a mut self, - _hint: &'a <DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: &'a <DynTag<'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E> as HintMeta<'ctx>>::Hint, ) -> Future< 'a, 'ctx, - Result<Known<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E>>, ()>, + Result<Known<'a, 'ctx, DynTag<'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E>>, ()>, E, > { E::ready(Ok(TagKnown { @@ -272,18 +269,17 @@ where } } -impl<'a, 'ctx: 'a, T, I, M, E> - Hint<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_MAP.to_int() }>, E>, E> +impl<'ctx, T, I, M, E> Hint<'ctx, DynTag<'ctx, TagConst<{ TAG_MAP.to_int() }>, E>, E> for StructWalker<'ctx, T, I, M, E> where E: Effect<'ctx>, I: StructTypeInfo<'ctx, M>, T: Sync + 'static, { - fn hint( + fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <DynTag<'a, 'ctx, TagConst<{ TAG_MAP.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: <DynTag<'ctx, TagConst<{ TAG_MAP.to_int() }>, E> as HintMeta<'ctx>>::Hint, ) -> Future<'a, 'ctx, Flow, E> { E::map( visit_tag::<TagConst<{ TAG_MAP.to_int() }>, E, _>(TagConst, visitor, NoopWalker::new()), @@ -298,13 +294,13 @@ where ) } - fn known( + fn known<'a>( &'a mut self, - _hint: &'a <DynTag<'a, 'ctx, TagConst<{ TAG_MAP.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: &'a <DynTag<'ctx, TagConst<{ TAG_MAP.to_int() }>, E> as HintMeta<'ctx>>::Hint, ) -> Future< 'a, 'ctx, - Result<Known<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_MAP.to_int() }>, E>>, ()>, + Result<Known<'a, 'ctx, DynTag<'ctx, TagConst<{ TAG_MAP.to_int() }>, E>>, ()>, E, > { E::ready(Ok(TagKnown { @@ -313,18 +309,17 @@ where } } -impl<'a, 'ctx: 'a, T, I, M, E> - Hint<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E>, E> +impl<'ctx, T, I, M, E> Hint<'ctx, DynTag<'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E>, E> for StructWalker<'ctx, T, I, M, E> where E: Effect<'ctx>, I: StructTypeInfo<'ctx, M>, T: Sync + 'static, { - fn hint( + fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <DynTag<'a, 'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: <DynTag<'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E> as HintMeta<'ctx>>::Hint, ) -> Future<'a, 'ctx, Flow, E> { E::map( visit_tag::<TagConst<{ TAG_STRUCT.to_int() }>, E, _>( @@ -343,13 +338,13 @@ where ) } - fn known( + fn known<'a>( &'a mut self, - _hint: &'a <DynTag<'a, 'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: &'a <DynTag<'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E> as HintMeta<'ctx>>::Hint, ) -> Future< 'a, 'ctx, - Result<Known<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E>>, ()>, + Result<Known<'a, 'ctx, DynTag<'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E>>, ()>, E, > { E::ready(Ok(TagKnown { @@ -358,18 +353,17 @@ where } } -impl<'a, 'ctx: 'a, T, I, M, E> - Hint<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E>, E> +impl<'ctx, T, I, M, E> Hint<'ctx, DynTag<'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E>, E> for StructWalker<'ctx, T, I, M, E> where E: Effect<'ctx>, I: StructTypeInfo<'ctx, M>, T: Sync + 'static, { - fn hint( + fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: <DynTag<'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E> as HintMeta<'ctx>>::Hint, ) -> Future<'a, 'ctx, Flow, E> { E::map( visit_tag::<TagConst<{ TAG_TYPE_ID.to_int() }>, E, _>( @@ -388,13 +382,13 @@ where ) } - fn known( + fn known<'a>( &'a mut self, - _hint: &'a <DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: &'a <DynTag<'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E> as HintMeta<'ctx>>::Hint, ) -> Future< 'a, 'ctx, - Result<Known<'a, 'ctx, DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E>>, ()>, + Result<Known<'a, 'ctx, DynTag<'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E>>, ()>, E, > { E::ready(Ok(TagKnown { @@ -403,57 +397,55 @@ where } } -impl<'a, 'ctx: 'a, T, I, M, E> Hint<'a, 'ctx, DynTag<'a, 'ctx, TagDyn, E>, E> - for StructWalker<'ctx, T, I, M, E> +impl<'ctx, T, I, M, E> Hint<'ctx, DynTag<'ctx, TagDyn, E>, E> for StructWalker<'ctx, T, I, M, E> where E: Effect<'ctx>, I: StructTypeInfo<'ctx, M>, T: Sync + 'static, { - fn hint( + fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - hint: <DynTag<'a, 'ctx, TagDyn, E> as HintMeta<'ctx>>::Hint, + hint: <DynTag<'ctx, TagDyn, E> as HintMeta<'ctx>>::Hint, ) -> Future<'a, 'ctx, Flow, E> { match hint.kind.0 { crate::TAG_TYPE_ID => Hint::< - 'a, - 'ctx, - DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E>, - E, - >::hint(self, visitor, TagHint { kind: TagConst }), - crate::TAG_STRUCT => Hint::< - 'a, 'ctx, - DynTag<'a, 'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E>, - E, - >::hint(self, visitor, TagHint { kind: TagConst }), - crate::TAG_MAP => Hint::< - 'a, - 'ctx, - DynTag<'a, 'ctx, TagConst<{ TAG_MAP.to_int() }>, E>, + DynTag<'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E>, E, >::hint(self, visitor, TagHint { kind: TagConst }), + crate::TAG_STRUCT => { + Hint::<'ctx, DynTag<'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E>, E>::hint( + self, + visitor, + TagHint { kind: TagConst }, + ) + } + crate::TAG_MAP => { + Hint::<'ctx, DynTag<'ctx, TagConst<{ TAG_MAP.to_int() }>, E>, E>::hint( + self, + visitor, + TagHint { kind: TagConst }, + ) + } crate::TAG_TYPE_NAME => Hint::< - 'a, 'ctx, - DynTag<'a, 'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E>, + DynTag<'ctx, TagConst<{ TAG_TYPE_NAME.to_int() }>, E>, E, >::hint(self, visitor, TagHint { kind: TagConst }), crate::TAG_FIELD_NAMES => Hint::< - 'a, 'ctx, - DynTag<'a, 'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E>, + DynTag<'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E>, E, >::hint(self, visitor, TagHint { kind: TagConst }), _ => E::ready(Flow::Continue), } } - fn known( + fn known<'a>( &'a mut self, - hint: &'a <DynTag<'a, 'ctx, TagDyn, E> as HintMeta<'ctx>>::Hint, - ) -> Future<'a, 'ctx, Result<Known<'a, 'ctx, DynTag<'a, 'ctx, TagDyn, E>>, ()>, E> { + hint: &'a <DynTag<'ctx, TagDyn, E> as HintMeta<'ctx>>::Hint, + ) -> Future<'a, 'ctx, Result<Known<'a, 'ctx, DynTag<'ctx, TagDyn, E>>, ()>, E> { E::ready(match hint.kind { TagDyn(crate::TAG_TYPE_ID) | TagDyn(crate::TAG_STRUCT) => Ok(TagKnown { kind_available: Some(true), @@ -465,14 +457,14 @@ where } } -impl<'a, 'ctx: 'a, T, I, M, E> Hint<'a, 'ctx, DynValue<'a, 'ctx, BorrowedStatic<'ctx, T>, E>, E> +impl<'ctx, T, I, M, E> Hint<'ctx, DynValue<'ctx, DynBorrowedStatic<'ctx, T>, E>, E> for StructWalker<'ctx, T, I, M, E> where E: Effect<'ctx>, I: StructTypeInfo<'ctx, M>, T: Sync + 'static, { - fn hint(&'a mut self, visitor: Visitor<'a, 'ctx>, _hint: ()) -> Future<'a, 'ctx, Flow, E> { + fn hint<'a>(&'a mut self, visitor: Visitor<'a, 'ctx>, _hint: ()) -> Future<'a, 'ctx, Flow, E> { E::map( visit_value::<_, E>(visitor, BorrowedStatic(self.value)), |status| match status { @@ -482,22 +474,21 @@ where ) } - fn known(&'a mut self, _hint: &'a ()) -> Future<'a, 'ctx, Result<(), ()>, E> { + fn known<'a>(&'a mut self, _hint: &'a ()) -> Future<'a, 'ctx, Result<(), ()>, E> { E::ready(Ok(())) } } -impl<'a, 'ctx: 'a, T, I, M, E> Hint<'a, 'ctx, DynSequence<'a, 'ctx, E>, E> - for StructWalker<'ctx, T, I, M, E> +impl<'ctx, T, I, M, E> Hint<'ctx, DynSequence<'ctx, E>, E> for StructWalker<'ctx, T, I, M, E> where E: Effect<'ctx>, I: StructTypeInfo<'ctx, M, T = T>, T: Sync, { - fn hint( + fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <DynSequence<'a, 'ctx, E> as HintMeta<'ctx>>::Hint, + _hint: <DynSequence<'ctx, E> as HintMeta<'ctx>>::Hint, ) -> Future<'a, 'ctx, Flow, E> { E::map(visit_sequence::<E>(visitor, self), |status| match status { Status::Skipped(_) => Flow::Continue, @@ -505,10 +496,10 @@ where }) } - fn known( + fn known<'a>( &'a mut self, - _hint: &'a <DynSequence<'a, 'ctx, E> as HintMeta<'ctx>>::Hint, - ) -> Future<'a, 'ctx, Result<Known<'a, 'ctx, DynSequence<'a, 'ctx, E>>, ()>, E> { + _hint: &'a <DynSequence<'ctx, E> as HintMeta<'ctx>>::Hint, + ) -> Future<'a, 'ctx, Result<Known<'a, 'ctx, DynSequence<'ctx, E>>, ()>, E> { let len = I::FIELDS.len(); E::ready(Ok(SequenceKnown { |