Skip to main content

scratch_test_value/
math.rs

1use crate::{SNumber, quirks::SNumberToFloatQ};
2
3mod exp;
4mod modulo;
5mod round;
6mod sqrt;
7mod trig;
8
9macro_rules! lift_snumber_method {
10    ($([$($qs: ty),*])? $name: ident (pass)) => {
11        impl $crate::SValue {
12            pub fn $name<Q>(&self, sink: &mut Q) -> $crate::SNumber
13                where Q: $crate::QuirkSink<$crate::quirks::SValueToNumberQ>, $($(Q: $crate::QuirkSink<$qs>),+)?
14            {
15                self.q_as_number_strict_bool_text(sink).$name(sink)
16            }
17        }
18    };
19    ($([$($qs: ty),*])? $name: ident) => {
20        impl $crate::SValue {
21            pub fn $name<Q>(&self, sink: &mut Q) -> $crate::SNumber
22                where Q: $crate::QuirkSink<$crate::quirks::SValueToNumberQ>, $($(Q: $crate::QuirkSink<$qs>),+)?
23            {
24                self.q_as_number_strict_bool_text(sink).$name()
25            }
26        }
27    };
28}
29
30impl SNumber {
31    pub fn abs(&self) -> SNumber {
32        match self {
33            // TODO add warning for i64::MIN
34            Self::Int(i) => Self::Int(i.saturating_abs()),
35            Self::Float(f) => Self::Float(f.abs()),
36        }
37    }
38}
39impl crate::SValue {
40    pub fn q_abs<Q>(&self, sink: &mut Q) -> SNumber
41    where
42        Q: crate::QuirkSink<crate::quirks::SValueToNumberQ>,
43    {
44        self.q_as_number_strict_bool_text(sink).abs()
45    }
46
47    pub fn q_modulo<Q>(&self, other: &Self, sink: &mut Q) -> SNumber
48    where
49        Q: crate::QuirkSink<crate::quirks::SNumberToFloatQ>
50            + crate::QuirkSink<crate::quirks::SValueToNumberQ>,
51    {
52        self.q_as_number(sink).modulo(&other.q_as_number(sink))
53    }
54}
55
56lift_snumber_method! {floor}
57lift_snumber_method! {round}
58lift_snumber_method! {ceil}
59lift_snumber_method! {sqrt}
60
61lift_snumber_method! {[SNumberToFloatQ] q_cos (pass)}
62lift_snumber_method! {[SNumberToFloatQ] q_sin (pass)}
63lift_snumber_method! {[SNumberToFloatQ] q_tan (pass)}
64
65lift_snumber_method! {[SNumberToFloatQ] q_acos (pass)}
66lift_snumber_method! {[SNumberToFloatQ] q_asin (pass)}
67lift_snumber_method! {[SNumberToFloatQ] q_atan (pass)}
68
69lift_snumber_method! {[SNumberToFloatQ] q_exp (pass)}
70lift_snumber_method! {[SNumberToFloatQ] q_power_of_10 (pass)}
71lift_snumber_method! {[SNumberToFloatQ] q_ln (pass)}
72lift_snumber_method! {[SNumberToFloatQ] q_log10 (pass)}
73
74/*
75lift_snumber_method! {q_ln}
76lift_snumber_method! {q_log10}
77lift_snumber_method! {q_exp}
78lift_snumber_method! {q_pow10}
79*/