Diffstat (limited to 'src/walk/walkers/core/key_value.rs')
-rw-r--r--src/walk/walkers/core/key_value.rs32
1 files changed, 23 insertions, 9 deletions
diff --git a/src/walk/walkers/core/key_value.rs b/src/walk/walkers/core/key_value.rs
index 987d3bf..9045bf9 100644
--- a/src/walk/walkers/core/key_value.rs
+++ b/src/walk/walkers/core/key_value.rs
@@ -1,5 +1,7 @@
+use core::marker::PhantomData;
+
use crate::{
- effect::{Effect, ObjSafe},
+ effect::{Adapters, Effect, ObjSafe},
never::Never,
protocol::{
visitor::{visit_tag, TagConst, TagError, TagKind, VisitResult},
@@ -52,17 +54,29 @@ where
E: Effect,
T: TagKind,
K: crate::Walker<'ctx, E>,
- V: crate::Walker<'ctx, E>,
+ V: crate::Walker<'ctx, E> + 'ctx,
{
#[inline(always)]
- fn walk<'a>(
+ fn walk<'b: 'c, 'c>(
self,
- mut visitor: DynVisitor<'a, 'ctx>,
- ) -> ObjSafe<'a, Result<Self::Output, Self::Error>, E>
- where
- Self: 'a,
- {
- todo!()
+ mut visitor: DynVisitor<'b, 'ctx>,
+ ) -> ObjSafe<'c, Result<Self::Output, Self::Error>, E> {
+ E::ready(visitor)
+ .as_ctx_for(move |visitor, _| {
+ (
+ self.value_walker
+ .walk(visitor.cast())
+ .map(|result| match result {
+ Ok(_) => Ok::<_, Self::Error>(()),
+ Err(_err) => todo!(),
+ })
+ .into(),
+ PhantomData,
+ )
+ })
+ .map(|(_, value)| value)
+ .into()
+
// E::wrap(async move {
// match visit_tag::<T, E, _>(self.tag, visitor.cast(), NoopWalker::new()).await {
// Ok(VisitResult::Skipped(_)) => {