use std::convert::Infallible;
use smallvec::SmallVec;
use crate::graph::region::WeakRegion;
use super::ValId;
#[derive(Debug, Clone)]
pub enum ValueError {
NotAFunction(NotAFunction),
IncomparableRegions(IncomparableRegions),
RegionAlreadyFused(RegionAlreadyFused),
NotImplementedError
}
#[derive(Debug, Clone)]
pub enum RegionError {
IncomparableRegions(IncomparableRegions),
RegionAlreadyFused(RegionAlreadyFused)
}
impl From<RegionError> for ValueError {
fn from(err: RegionError) -> ValueError {
match err {
RegionError::IncomparableRegions(i) => ValueError::IncomparableRegions(i),
RegionError::RegionAlreadyFused(r) => ValueError::RegionAlreadyFused(r)
}
}
}
const SMALL_INCOMPARABLE_REGIONS: usize = 2;
#[derive(Debug, Clone)]
pub struct RegionAlreadyFused;
impl From<Infallible> for RegionAlreadyFused {
fn from(err: Infallible) -> RegionAlreadyFused { match err {} }
}
impl From<RegionAlreadyFused> for ValueError {
fn from(err: RegionAlreadyFused) -> ValueError { ValueError::RegionAlreadyFused(err) }
}
impl From<RegionAlreadyFused> for RegionError {
fn from(err: RegionAlreadyFused) -> RegionError { RegionError::RegionAlreadyFused(err) }
}
#[derive(Debug, Clone)]
pub struct IncomparableRegions(pub SmallVec<[WeakRegion; SMALL_INCOMPARABLE_REGIONS]>);
impl From<Infallible> for IncomparableRegions {
fn from(err: Infallible) -> IncomparableRegions { match err {} }
}
#[derive(Debug, Clone)]
pub struct NotAFunction {
pub applied: Option<ValId>,
pub argument: Option<ValId>
}
impl From<Infallible> for ValueError { fn from(i: Infallible) -> ValueError { match i {} } }
impl From<NotAFunction> for ValueError {
fn from(n: NotAFunction) -> ValueError { ValueError::NotAFunction(n) }
}
impl From<IncomparableRegions> for ValueError {
fn from(i: IncomparableRegions) -> ValueError { ValueError::IncomparableRegions(i) }
}
impl From<IncomparableRegions> for RegionError {
fn from(i: IncomparableRegions) -> RegionError { RegionError::IncomparableRegions(i) }
}