InjectedResolver

This commit is contained in:
AF 2023-05-26 20:34:10 +00:00
parent 0613f3fffc
commit 107a83ed06
2 changed files with 30 additions and 0 deletions

View File

@ -1,4 +1,5 @@
pub mod counted; pub mod counted;
pub mod inject;
pub mod traced; pub mod traced;
use std::{error::Error, fmt::Display, rc::Rc}; use std::{error::Error, fmt::Display, rc::Rc};

29
src/testing/inject.rs Normal file
View 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),
)
}
}