Inject::inject_mentionable

This commit is contained in:
AF 2023-06-30 20:30:32 +00:00
parent 64ffe31672
commit 671f0df6ae

View File

@ -1,9 +1,22 @@
use std::rc::Rc; use std::rc::Rc;
use crate::rcore::*; use crate::rcore::*;
use crate::rstd::{singular::*, *};
trait Inject<'a, Ctx: Context<'a>>: 'a { trait Inject<'a, Ctx: Context<'a>>: 'a + Sized {
fn inject<A: 'a>(&self, fa: Wrapped<'a, Ctx, A>) -> Wrapped<'a, Ctx, A>; fn inject<A: 'a>(&self, fa: Wrapped<'a, Ctx, A>) -> Wrapped<'a, Ctx, A>;
fn inject_mentionable<A: Mentionable<'a, Ctx>>(
self: Rc<Self>,
a: &A,
) -> ParseResultA<'a, Ctx, A> {
let factory = a.factory();
let inject = self;
let resolver = SingularResolver::from_mentionable(a).into_rc();
let resolver = InjectedResolver { resolver, inject }.into_rc();
let bytes = a.bytes();
factory.parse_slice(&bytes, &resolver)
}
} }
struct InjectedResolver<'a, Ctx: Context<'a>, F: Inject<'a, Ctx>> { struct InjectedResolver<'a, Ctx: Context<'a>, F: Inject<'a, Ctx>> {
@ -12,16 +25,15 @@ struct InjectedResolver<'a, Ctx: Context<'a>, F: Inject<'a, Ctx>> {
} }
impl<'a, Ctx: Context<'a>, F: Inject<'a, Ctx>> Resolver<'a, Ctx> for InjectedResolver<'a, Ctx, 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> { fn resolve(self: Rc<Self>, address: Address) -> HashResolution<'a, Ctx> {
let inject = self.inject.clone(); let inject = self.inject.clone();
self.inject.inject( self.inject.inject(
self.resolver self.resolver
.clone() .clone()
.resolve_map(address, |resolved| match resolved { .resolve_map(address, |resolved| match resolved {
Ok((source, resolver)) => Ok(( Ok((source, resolver)) => {
source, Ok((source, InjectedResolver { resolver, inject }.into_rc()))
Rc::new(InjectedResolver { resolver, inject }) as Rc<dyn Resolver<'a, Ctx>>, }
)),
Err(e) => Err(e), Err(e) => Err(e),
}), }),
) )