30 lines
918 B
Rust
30 lines
918 B
Rust
use std::rc::Rc;
|
|
|
|
use crate::func::context::*;
|
|
use crate::rcore::*;
|
|
|
|
trait Inject<'a, Ctx: Context<'a>>: 'a {
|
|
fn inject<A: 'a>(fa: Wrapped<'a, Ctx, A>) -> Wrapped<'a, Ctx, A>;
|
|
}
|
|
|
|
struct InjectedResolver<'a, Ctx: Context<'a>, F: Inject<'a, Ctx>> {
|
|
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
|
inject: Rc<F>,
|
|
}
|
|
|
|
impl<'a, Ctx: Context<'a>, F: Inject<'a, Ctx>> Resolver<'a, Ctx> for InjectedResolver<'a, Ctx, F> {
|
|
fn resolve(self: Rc<Self>, 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<dyn Resolver<'a, Ctx>>,
|
|
)),
|
|
Err(e) => Err(e),
|
|
},
|
|
)
|
|
}
|
|
}
|