Diffstat (limited to 'src/walk/walkers/core/value.rs')
-rw-r--r--src/walk/walkers/core/value.rs32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/walk/walkers/core/value.rs b/src/walk/walkers/core/value.rs
index ce67f88..252ca35 100644
--- a/src/walk/walkers/core/value.rs
+++ b/src/walk/walkers/core/value.rs
@@ -1,8 +1,11 @@
use crate::{
- any::OwnedStatic,
- effect::{Effect, EffectiveExt as _, ErasedEffective},
+ any::{BorrowedStatic, OwnedStatic, TempBorrowedStatic},
+ effect::{Effect, EffectExt as _, Effective, EffectiveExt as _, ErasedEffective},
never::Never,
- protocol::{visitor::visit_value, DynVisitor},
+ protocol::{
+ visitor::{visit_value, EffectiveVisitExt as _, VisitResult},
+ DynVisitor,
+ },
};
/// A very basic walker that uses the [`Value`][crate::protocol::visitor::value::Value] protocol.
@@ -46,10 +49,6 @@ impl<'ctx, T: Send + Sync + 'static, E: Effect> crate::Walker<'ctx, E> for Value
) -> ErasedEffective<'c, Result<Self::Output, Self::Error>, E> {
// Attempt to visit using the value protocol.
visit_value::<_, E>(visitor, OwnedStatic(self.0)).map(|_| Ok(()))
- // E::map(
- // visit_value::<_, E>(visitor, OwnedStatic(self.0)),
- // |_| Ok(()),
- // )
}
}
@@ -71,17 +70,24 @@ impl<'ctx, T: ?Sized + Send + Sync + 'static, E: Effect> crate::Walker<'ctx, E>
{
type Error = Never;
- type Output = ();
+ type Output = &'ctx T;
#[inline(always)]
fn walk<'b: 'c, 'c>(
self,
- _visitor: DynVisitor<'b, 'ctx>,
+ visitor: DynVisitor<'b, 'ctx>,
) -> ErasedEffective<'c, Result<Self::Output, Self::Error>, E> {
// Attempt to visit using the value protocol.
- todo!()
- // E::map(visit_value::<_, E>(visitor, BorrowedStatic(self.0)), |_| {
- // Ok(())
- // })
+ E::as_ctx((self, visitor), |(this, visitor)| {
+ visit_value::<_, E>(visitor.cast(), BorrowedStatic(this.0))
+ .map(VisitResult::unit_skipped)
+ .cast()
+ })
+ .if_skipped(|(this, visitor)| {
+ visit_value::<_, E>(visitor.cast(), TempBorrowedStatic(this.0))
+ .map(VisitResult::unit_skipped)
+ .cast()
+ })
+ .map(|((this, _), _)| Ok(this.0))
}
}