InjectedResolver
This commit is contained in:
parent
0613f3fffc
commit
107a83ed06
@ -1,4 +1,5 @@
|
||||
pub mod counted;
|
||||
pub mod inject;
|
||||
pub mod traced;
|
||||
|
||||
use std::{error::Error, fmt::Display, rc::Rc};
|
||||
|
29
src/testing/inject.rs
Normal file
29
src/testing/inject.rs
Normal file
@ -0,0 +1,29 @@
|
||||
use std::rc::Rc;
|
||||
|
||||
use crate::func::*;
|
||||
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::T as Functor>::fmap(
|
||||
|resolved| match resolved {
|
||||
Ok((source, resolver)) => Ok((
|
||||
source,
|
||||
Rc::new(InjectedResolver { resolver, inject }) as Rc<dyn Resolver<'a, Ctx>>,
|
||||
)),
|
||||
Err(e) => Err(e),
|
||||
},
|
||||
self.resolver.clone().resolve(address),
|
||||
)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user