Added simple scientific units
This commit is contained in:
parent
d4f631f6bd
commit
a15c0fa888
|
@ -264,6 +264,9 @@ basicLiteral
|
|||
identifier 'identifier'
|
||||
= ([_a-z]+[_a-z0-9]i*) {return nodeIdentifier(text())}
|
||||
|
||||
unitIdentifier 'identifier'
|
||||
= ([_a-zA-Z]+[_a-z0-9]i*) {return nodeIdentifier(text())}
|
||||
|
||||
dollarIdentifier '$identifier'
|
||||
= ([\$_a-z]+[\$_a-z0-9]i*) {return nodeIdentifier(text())}
|
||||
|
||||
|
@ -271,7 +274,7 @@ string 'string'
|
|||
= characters:("'" @([^'])* "'") {return nodeString(characters.join(''))}
|
||||
/ characters:('"' @([^"])* '"') {return nodeString(characters.join(''))}
|
||||
|
||||
number = number:(float / integer) unit:identifier?
|
||||
number = number:(float / integer) unit:unitIdentifier?
|
||||
{
|
||||
if (unit === null)
|
||||
{ return number }
|
||||
|
|
|
@ -26,10 +26,45 @@ let dateDispatch = (call: EV.functionCall, _: DistributionOperation.env): option
|
|||
}
|
||||
}
|
||||
|
||||
module ScientificUnit = {
|
||||
let nameToMultiplier = str =>
|
||||
switch str {
|
||||
| "n" => Some(1E-9)
|
||||
| "m" => Some(1E-3)
|
||||
| "k" => Some(1E3)
|
||||
| "M" => Some(1E6)
|
||||
| "B" => Some(1E9)
|
||||
| "G" => Some(1E9)
|
||||
| "T" => Some(1E12)
|
||||
| "P" => Some(1E15)
|
||||
| _ => None
|
||||
}
|
||||
|
||||
let getMultiplier = (r: string) => {
|
||||
let match = Js.String2.match_(r, %re(`/fromUnit_([_a-zA-Z]*)/`))
|
||||
switch match {
|
||||
| Some([_, unit]) => nameToMultiplier(unit)
|
||||
| _ => None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let durationDispatch = (call: EV.functionCall, _: DistributionOperation.env): option<
|
||||
result<expressionValue, QuriSquiggleLang.Reducer_ErrorValue.errorValue>,
|
||||
> => {
|
||||
switch call {
|
||||
| (
|
||||
("fromUnit_n"
|
||||
| "fromUnit_m"
|
||||
| "fromUnit_k"
|
||||
| "fromUnit_M"
|
||||
| "fromUnit_B"
|
||||
| "fromUnit_G"
|
||||
| "fromUnit_T"
|
||||
| "fromUnit_P") as op,
|
||||
[EvNumber(f)],
|
||||
) =>
|
||||
op->ScientificUnit.getMultiplier->E.O2.fmap(multiplier => EV.EvNumber(f *. multiplier)->Ok)
|
||||
| ("toString", [EvTimeDuration(t)]) => EV.EvString(DateTime.Duration.toString(t))->Ok->Some
|
||||
| ("minutes", [EvNumber(f)]) => EV.EvTimeDuration(DateTime.Duration.fromMinutes(f))->Ok->Some
|
||||
| ("fromUnit_minutes", [EvNumber(f)]) =>
|
||||
|
|
Loading…
Reference in New Issue
Block a user