Diffstat (limited to 'src/walk/walkers/core/struct.rs')
-rw-r--r--src/walk/walkers/core/struct.rs167
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 {