CountedInject

This commit is contained in:
AF 2023-06-30 20:50:03 +00:00
parent e3ca573bdf
commit 404fc8c802

View File

@ -3,6 +3,7 @@ use std::cmp::max;
use crate::func::{context::*, *}; use crate::func::{context::*, *};
use crate::rcore::*; use crate::rcore::*;
use super::inject::*;
use super::*; use super::*;
pub struct TestContextCounted; pub struct TestContextCounted;
@ -56,36 +57,20 @@ impl<A> Counted<A> {
} }
} }
struct CountedResolver<'a> { struct CountedInject;
resolver: Rc<dyn Resolver<'a, TestContextCounted>>,
}
impl<'a> CountedResolver<'a> { impl<'a> Inject<'a, TestContextCounted> for CountedInject {
fn new( fn inject<A: 'a>(
resolver: Rc<dyn Resolver<'a, TestContextCounted>>, &self,
) -> Rc<dyn Resolver<'a, TestContextCounted>> { fa: Wrapped<'a, TestContextCounted, A>,
Rc::new(Self { resolver }) ) -> Wrapped<'a, TestContextCounted, A> {
} fa.add(1)
}
impl<'a> Resolver<'a, TestContextCounted> for CountedResolver<'a> {
fn resolve(self: Rc<Self>, address: Address) -> HashResolution<'a, TestContextCounted> {
self.resolver
.clone()
.resolve_map(address, |resolved| {
let (src, resolver) = resolved?;
let delayed: Rc<dyn Resolver<'a, TestContextCounted>> =
Rc::new(CountedResolver { resolver });
Ok((src, delayed))
})
.add(1)
} }
} }
pub trait Delayable<'a>: Mentionable<'a, TestContextCounted> + Sized { pub trait Delayable<'a>: Mentionable<'a, TestContextCounted> + Sized {
fn delay(self: Rc<Self>) -> ParseResultA<'a, TestContextCounted, Self> { fn delay(&self) -> ParseResultA<'a, TestContextCounted, Self> {
let factory = self.factory(); Rc::new(CountedInject).inject_mentionable(self)
TypelessMentionable::from_typed(self).cast_full(factory, CountedResolver::new)
} }
} }