SingularRobust
This commit is contained in:
parent
72845b59ff
commit
160aa3910a
@ -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 _);
|
||||||
|
Loading…
Reference in New Issue
Block a user