use crate::context::AttributeContext;
use crate::expr::Expr;
use crate::tags::TagMask;
#[derive(Clone, Debug)]
pub enum Modifier {
Flat(f32),
Expr(Expr),
}
impl Modifier {
pub fn evaluate(&self, context: &AttributeContext) -> f32 {
match self {
Modifier::Flat(val) => *val,
Modifier::Expr(expr) => expr.evaluate(context),
}
}
}
impl PartialEq for Modifier {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Modifier::Flat(a), Modifier::Flat(b)) => (a - b).abs() < f32::EPSILON,
(Modifier::Expr(a), Modifier::Expr(b)) => a == b,
_ => false,
}
}
}
impl From<f32> for Modifier {
fn from(val: f32) -> Self {
Modifier::Flat(val)
}
}
impl From<Expr> for Modifier {
fn from(expr: Expr) -> Self {
Modifier::Expr(expr)
}
}
#[derive(Clone, Debug)]
pub struct TaggedModifier {
pub modifier: Modifier,
pub tag: TagMask,
}
impl TaggedModifier {
pub fn new(modifier: Modifier, tag: TagMask) -> Self {
Self { modifier, tag }
}
pub fn global(modifier: Modifier) -> Self {
Self {
modifier,
tag: TagMask::NONE,
}
}
}
impl PartialEq for TaggedModifier {
fn eq(&self, other: &Self) -> bool {
self.modifier == other.modifier && self.tag == other.tag
}
}