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