scratch_test_value/
math.rs1use 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 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