use std::rc::Rc; use crate::func::context::*; use crate::rcore::*; trait Inject<'a, Ctx: Context<'a>>: 'a { fn inject(fa: Wrapped<'a, Ctx, A>) -> Wrapped<'a, Ctx, A>; } struct InjectedResolver<'a, Ctx: Context<'a>, F: Inject<'a, Ctx>> { resolver: Rc>, inject: Rc, } impl<'a, Ctx: Context<'a>, F: Inject<'a, Ctx>> Resolver<'a, Ctx> for InjectedResolver<'a, Ctx, F> { fn resolve(self: Rc, address: crate::rcore::Address) -> HashResolution<'a, Ctx> { let inject = self.inject.clone(); Ctx::fmap( self.resolver.clone().resolve(address), |resolved| match resolved { Ok((source, resolver)) => Ok(( source, Rc::new(InjectedResolver { resolver, inject }) as Rc>, )), Err(e) => Err(e), }, ) } }