From 107a83ed06635847d5d1e6ff1ff9929952397a4d Mon Sep 17 00:00:00 2001 From: timofey Date: Fri, 26 May 2023 20:34:10 +0000 Subject: [PATCH] `InjectedResolver` --- src/testing.rs | 1 + src/testing/inject.rs | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/testing/inject.rs diff --git a/src/testing.rs b/src/testing.rs index 057bba4..7599578 100644 --- a/src/testing.rs +++ b/src/testing.rs @@ -1,4 +1,5 @@ pub mod counted; +pub mod inject; pub mod traced; use std::{error::Error, fmt::Display, rc::Rc}; diff --git a/src/testing/inject.rs b/src/testing/inject.rs new file mode 100644 index 0000000..addbda9 --- /dev/null +++ b/src/testing/inject.rs @@ -0,0 +1,29 @@ +use std::rc::Rc; + +use crate::func::*; +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(); + ::fmap( + |resolved| match resolved { + Ok((source, resolver)) => Ok(( + source, + Rc::new(InjectedResolver { resolver, inject }) as Rc>, + )), + Err(e) => Err(e), + }, + self.resolver.clone().resolve(address), + ) + } +}