SingularRobust
All checks were successful
buildbot/cargo fmt (1.72) Build done.
buildbot/cargo doc (1.72) Build done.
buildbot/cargo clippy (1.72) Build done.
buildbot/cargo test (1.65) Build done.
buildbot/cargo clippy (1.65) Build done.

This commit is contained in:
AF 2023-09-03 19:05:23 +00:00
parent 72845b59ff
commit 160aa3910a

View File

@ -1,3 +1,4 @@
use crate::func::context::*;
use crate::rcore::*; use crate::rcore::*;
use super::*; use super::*;
@ -39,6 +40,10 @@ pub struct SingularResolver<'a, Ctx: Context<'a>> {
points: Vec<Arc<dyn SingularResolution<'a, Ctx>>>, points: Vec<Arc<dyn SingularResolution<'a, Ctx>>>,
} }
pub struct SingularRobust<'a, Ctx: Context<'a>> {
resolver: Arc<SingularResolver<'a, Ctx>>,
}
#[derive(Debug)] #[derive(Debug)]
pub enum SingularityError { pub enum SingularityError {
OutOfBounds { OutOfBounds {
@ -108,6 +113,21 @@ impl<'a, Ctx: Context<'a>> Resolver<'a, Ctx> for SingularResolver<'a, Ctx> {
} }
} }
trait SingularCtx<'a>: Context<'a> {
fn from_singular(error: SingularityError) -> Self::LookupError;
}
impl<'a, Ctx: SingularCtx<'a>> Resolver<'a, Ctx> for SingularRobust<'a, Ctx> {
fn resolve(self: Arc<Self>, address: Address) -> HashResolution<'a, Ctx> {
self.resolver
.clone()
.resolve_robust(address)
.map_err(Ctx::from_singular)
.map_err(Err)
.unwrap_or_else(Ctx::pure)
}
}
impl<'a, Ctx: Context<'a>> PointsVisitor<'a, Ctx> for Vec<Arc<dyn SingularResolution<'a, Ctx>>> { impl<'a, Ctx: Context<'a>> PointsVisitor<'a, Ctx> for Vec<Arc<dyn SingularResolution<'a, Ctx>>> {
fn visit<A: Mentionable<'a, Ctx>>(&mut self, point: &Point<'a, Ctx, A>) { fn visit<A: Mentionable<'a, Ctx>>(&mut self, point: &Point<'a, Ctx, A>) {
self.push(Arc::new(point.clone()) as _); self.push(Arc::new(point.clone()) as _);