Wired up the OwnedLiterals to the math functions.
This commit is contained in:
parent
fdd467298a
commit
431b34dac7
@ -138,21 +138,21 @@ impl Rem<MathNumber> for MathNumber {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl MathNumber {
|
impl MathNumber {
|
||||||
fn math_abs(&self) -> Option<OwnedLiteral> {
|
pub fn math_abs(&self) -> Option<OwnedLiteral> {
|
||||||
match self {
|
match self {
|
||||||
MathNumber::Failure => None,
|
MathNumber::Failure => None,
|
||||||
MathNumber::Integer(num) => num.abs().try_into().ok(),
|
MathNumber::Integer(num) => num.abs().try_into().ok(),
|
||||||
MathNumber::Decimal(num) => Some(OwnedLiteral::LFloat(num.abs())),
|
MathNumber::Decimal(num) => Some(OwnedLiteral::LFloat(num.abs())),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn math_floor(&self) -> Option<OwnedLiteral> {
|
pub fn math_floor(&self) -> Option<OwnedLiteral> {
|
||||||
match self {
|
match self {
|
||||||
MathNumber::Failure => None,
|
MathNumber::Failure => None,
|
||||||
MathNumber::Integer(num) => (*num).try_into().ok(),
|
MathNumber::Integer(num) => (*num).try_into().ok(),
|
||||||
MathNumber::Decimal(num) => Some(OwnedLiteral::LFloat(num.floor())),
|
MathNumber::Decimal(num) => Some(OwnedLiteral::LFloat(num.floor())),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn math_ceil(&self) -> Option<OwnedLiteral> {
|
pub fn math_ceil(&self) -> Option<OwnedLiteral> {
|
||||||
match self {
|
match self {
|
||||||
MathNumber::Failure => None,
|
MathNumber::Failure => None,
|
||||||
MathNumber::Integer(num) => (*num).try_into().ok(),
|
MathNumber::Integer(num) => (*num).try_into().ok(),
|
||||||
|
@ -375,30 +375,84 @@ impl CompareContextElement for OwnedLiteral {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn math_subtract<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
fn math_subtract<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
// If its an OwnedLiteral then subtract them directly,
|
||||||
|
// otherwise defer to the other type's implementation of
|
||||||
|
// CompareContextElement since the end user could add any
|
||||||
|
// type.
|
||||||
|
match other.to_any().downcast_ref::<Self>() {
|
||||||
|
None => other.math_subtract(self),
|
||||||
|
Some(other_literal) => match (self, other_literal) {
|
||||||
|
(OwnedLiteral::LString(_), _) | (_, OwnedLiteral::LString(_)) => None,
|
||||||
|
(_, _) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
- std::convert::Into::<MathNumber>::into(other_literal))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_multiply<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
fn math_multiply<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
// If its an OwnedLiteral then multiply them directly,
|
||||||
|
// otherwise defer to the other type's implementation of
|
||||||
|
// CompareContextElement since the end user could add any
|
||||||
|
// type.
|
||||||
|
match other.to_any().downcast_ref::<Self>() {
|
||||||
|
None => other.math_multiply(self),
|
||||||
|
Some(other_literal) => match (self, other_literal) {
|
||||||
|
(OwnedLiteral::LString(_), _) | (_, OwnedLiteral::LString(_)) => None,
|
||||||
|
(_, _) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
* std::convert::Into::<MathNumber>::into(other_literal))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_divide<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
fn math_divide<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
// If its an OwnedLiteral then divide them directly, otherwise
|
||||||
|
// defer to the other type's implementation of
|
||||||
|
// CompareContextElement since the end user could add any
|
||||||
|
// type.
|
||||||
|
match other.to_any().downcast_ref::<Self>() {
|
||||||
|
None => other.math_divide(self),
|
||||||
|
Some(other_literal) => match (self, other_literal) {
|
||||||
|
(OwnedLiteral::LString(_), _) | (_, OwnedLiteral::LString(_)) => None,
|
||||||
|
(_, _) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
/ std::convert::Into::<MathNumber>::into(other_literal))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_modulus<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
fn math_modulus<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
// If its an OwnedLiteral then modulus them directly,
|
||||||
|
// otherwise defer to the other type's implementation of
|
||||||
|
// CompareContextElement since the end user could add any
|
||||||
|
// type.
|
||||||
|
match other.to_any().downcast_ref::<Self>() {
|
||||||
|
None => other.math_modulus(self),
|
||||||
|
Some(other_literal) => match (self, other_literal) {
|
||||||
|
(OwnedLiteral::LString(_), _) | (_, OwnedLiteral::LString(_)) => None,
|
||||||
|
(_, _) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
% std::convert::Into::<MathNumber>::into(other_literal))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_abs<'a>(&self) -> Option<IceResult<'a>> {
|
fn math_abs<'a>(&self) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
std::convert::Into::<MathNumber>::into(self)
|
||||||
|
.math_abs()
|
||||||
|
.map(IceResult::from_owned)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_floor<'a>(&self) -> Option<IceResult<'a>> {
|
fn math_floor<'a>(&self) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
std::convert::Into::<MathNumber>::into(self)
|
||||||
|
.math_floor()
|
||||||
|
.map(IceResult::from_owned)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_ceil<'a>(&self) -> Option<IceResult<'a>> {
|
fn math_ceil<'a>(&self) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
std::convert::Into::<MathNumber>::into(self)
|
||||||
|
.math_ceil()
|
||||||
|
.map(IceResult::from_owned)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user