1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
extern crate chrono;
extern crate chrono_tz;
extern crate dmntk_common;
#[macro_use]
extern crate lazy_static;
extern crate regex;
extern crate serde;
#[macro_use]
extern crate serde_derive;
pub use ast::{AstNode, OptAstNode};
pub use names::{Name, OptName, QualifiedName};
pub use scope::Scope;
pub use temporal::date::FeelDate;
pub use temporal::dt_duration::FeelDaysAndTimeDuration;
pub use temporal::subtract;
pub use temporal::ym_duration::FeelYearsAndMonthsDuration;
pub use temporal::FeelDateTime;
pub use temporal::FeelTime;
pub use types::{is_built_in_type_name, FeelType};
mod ast;
pub mod bif;
pub mod context;
pub mod dto;
mod names;
mod scope;
mod temporal;
mod types;
pub mod values;
use std::os::raw::c_double;
extern "C" {
fn roundeven(value: c_double) -> c_double;
}
pub fn round_half_to_even(number: f64, scale: f64) -> f64 {
let value = (number * 10_f64.powf(scale + 1.0)).trunc() / 10.0;
let rounded = unsafe { roundeven(value) };
rounded / 10_f64.powf(scale)
}
pub fn is_integer(value: f64) -> bool {
value.fract() < f64::EPSILON
}