|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
use crate::parser::OwnedLiteral;
|
|
|
|
|
use std::convert::TryFrom;
|
|
|
|
|
use std::convert::TryInto;
|
|
|
|
|
use std::ops::Add;
|
|
|
|
|
use std::ops::Div;
|
|
|
|
@ -138,13 +139,25 @@ impl Rem<MathNumber> for MathNumber {
|
|
|
|
|
|
|
|
|
|
impl MathNumber {
|
|
|
|
|
fn math_abs(&self) -> Option<OwnedLiteral> {
|
|
|
|
|
todo!()
|
|
|
|
|
match self {
|
|
|
|
|
MathNumber::Failure => None,
|
|
|
|
|
MathNumber::Integer(num) => num.abs().try_into().ok(),
|
|
|
|
|
MathNumber::Decimal(num) => Some(OwnedLiteral::LFloat(num.abs())),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
fn math_floor(&self) -> Option<OwnedLiteral> {
|
|
|
|
|
todo!()
|
|
|
|
|
match self {
|
|
|
|
|
MathNumber::Failure => None,
|
|
|
|
|
MathNumber::Integer(num) => (*num).try_into().ok(),
|
|
|
|
|
MathNumber::Decimal(num) => Some(OwnedLiteral::LFloat(num.floor())),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
fn math_ceil(&self) -> Option<OwnedLiteral> {
|
|
|
|
|
todo!()
|
|
|
|
|
match self {
|
|
|
|
|
MathNumber::Failure => None,
|
|
|
|
|
MathNumber::Integer(num) => (*num).try_into().ok(),
|
|
|
|
|
MathNumber::Decimal(num) => Some(OwnedLiteral::LFloat(num.ceil())),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -156,25 +169,19 @@ where
|
|
|
|
|
R: Into<i128>,
|
|
|
|
|
F: Fn(i128, i128) -> i128,
|
|
|
|
|
{
|
|
|
|
|
let result = operation(left.into(), right.into());
|
|
|
|
|
std::convert::TryInto::<u64>::try_into(result)
|
|
|
|
|
operation(left.into(), right.into()).try_into().ok()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl TryFrom<i128> for OwnedLiteral {
|
|
|
|
|
type Error = &'static str;
|
|
|
|
|
|
|
|
|
|
fn try_from(original: i128) -> Result<Self, Self::Error> {
|
|
|
|
|
std::convert::TryInto::<u64>::try_into(original)
|
|
|
|
|
.map(OwnedLiteral::LPositiveInteger)
|
|
|
|
|
.ok()
|
|
|
|
|
.or(std::convert::TryInto::<i64>::try_into(result)
|
|
|
|
|
.or(std::convert::TryInto::<i64>::try_into(original)
|
|
|
|
|
.map(OwnedLiteral::LNegativeInteger)
|
|
|
|
|
.ok())
|
|
|
|
|
.ok_or("Value does not fit into either u64 or i64")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// /// For math operations that take in integers and return integers
|
|
|
|
|
// /// (add, subtract, multiply)
|
|
|
|
|
// fn math_floats<L, R, F>(left: L, right: R, operation: F) -> Option<OwnedLiteral>
|
|
|
|
|
// where
|
|
|
|
|
// L: Into<f64>,
|
|
|
|
|
// R: Into<f64>,
|
|
|
|
|
// F: Fn(f64, f64) -> f64,
|
|
|
|
|
// {
|
|
|
|
|
// let result = operation(left.into(), right.into());
|
|
|
|
|
// std::convert::TryInto::<f64>::try_into(result)
|
|
|
|
|
// .map(OwnedLiteral::LFloat)
|
|
|
|
|
// .ok()
|
|
|
|
|
// }
|
|
|
|
|