TracedInject

This commit is contained in:
AF 2023-06-30 21:00:32 +00:00
parent 6e5302331c
commit a10447457a

View File

@ -1,27 +1,12 @@
use crate::rstd::{cast::*, typeless::*}; use crate::rstd::inject::*;
use super::*; use super::*;
struct TracedResolver<'a, Ctx: Context<'a>> { struct TracedInject;
resolver: Rc<dyn Resolver<'a, Ctx>>,
}
impl<'a, Ctx: Context<'a, _Tm = TracedInstance>> TracedResolver<'a, Ctx> { impl<'a, Ctx: Context<'a, _Tm = TracedInstance>> Inject<'a, Ctx> for TracedInject {
fn wrap(resolver: Rc<dyn Resolver<'a, Ctx>>) -> Rc<dyn Resolver<'a, Ctx>> { fn inject<A: 'a>(&self, fa: Wrapped<'a, Ctx, A>) -> Wrapped<'a, Ctx, A> {
Rc::new(Self { resolver }) fa.after_resolution()
}
}
impl<'a, Ctx: Context<'a, _Tm = TracedInstance>> Resolver<'a, Ctx> for TracedResolver<'a, Ctx> {
fn resolve(self: Rc<Self>, address: Address) -> HashResolution<'a, Ctx> {
self.resolver
.clone()
.resolve_map(address, |resolved| {
let (src, resolver) = resolved?;
let delayed: Rc<dyn Resolver<'a, Ctx>> = Rc::new(TracedResolver { resolver });
Ok((src, delayed))
})
.after_resolution()
} }
} }
@ -34,15 +19,9 @@ pub trait Traceable<'a, Ctx: Context<'a, _Tm = TracedInstance>>:
/// ///
/// [^extra]: applying [`Traceable::trace`] multiple times /// [^extra]: applying [`Traceable::trace`] multiple times
/// might affect the trace in undesireable ways /// might affect the trace in undesireable ways
fn trace(self: Rc<Self>) -> ParseResultA<'a, Ctx, Self>; fn trace(&self) -> ParseResultA<'a, Ctx, Self> {
Rc::new(TracedInject).inject_mentionable(self)
}
} }
impl<'a, Ctx: Context<'a, _Tm = TracedInstance>, A: Mentionable<'a, Ctx>> Traceable<'a, Ctx> for A impl<'a, Ctx: Context<'a, _Tm = TracedInstance>, A: Mentionable<'a, Ctx>> Traceable<'a, Ctx> for A {}
where
Ctx::LookupError: From<CastError<'a>>,
{
fn trace(self: Rc<Self>) -> ParseResultA<'a, Ctx, Self> {
let factory = self.factory();
TypelessMentionable::from_typed(self).cast_full(factory, TracedResolver::wrap)
}
}