1use polars::prelude::*;
2use pyo3::prelude::*;
3
4use super::PySeries;
5use crate::error::PyPolarsErr;
6
7#[pymethods]
8impl PySeries {
9 fn add(&self, py: Python, other: &PySeries) -> PyResult<Self> {
10 Ok(py
11 .allow_threads(|| &self.series + &other.series)
12 .map(Into::into)
13 .map_err(PyPolarsErr::from)?)
14 }
15 fn sub(&self, py: Python, other: &PySeries) -> PyResult<Self> {
16 Ok(py
17 .allow_threads(|| &self.series - &other.series)
18 .map(Into::into)
19 .map_err(PyPolarsErr::from)?)
20 }
21 fn div(&self, py: Python, other: &PySeries) -> PyResult<Self> {
22 Ok(py
23 .allow_threads(|| &self.series / &other.series)
24 .map(Into::into)
25 .map_err(PyPolarsErr::from)?)
26 }
27 fn mul(&self, py: Python, other: &PySeries) -> PyResult<Self> {
28 Ok(py
29 .allow_threads(|| &self.series * &other.series)
30 .map(Into::into)
31 .map_err(PyPolarsErr::from)?)
32 }
33 fn rem(&self, py: Python, other: &PySeries) -> PyResult<Self> {
34 Ok(py
35 .allow_threads(|| &self.series % &other.series)
36 .map(Into::into)
37 .map_err(PyPolarsErr::from)?)
38 }
39}
40
41macro_rules! impl_arithmetic {
42 ($name:ident, $type:ty, $operand:tt) => {
43 #[pymethods]
44 impl PySeries {
45 fn $name(&self, py: Python, other: $type) -> PyResult<Self> {
46 Ok(py.allow_threads(|| {&self.series $operand other}).into())
47 }
48 }
49 };
50}
51
52impl_arithmetic!(add_u8, u8, +);
53impl_arithmetic!(add_u16, u16, +);
54impl_arithmetic!(add_u32, u32, +);
55impl_arithmetic!(add_u64, u64, +);
56impl_arithmetic!(add_i8, i8, +);
57impl_arithmetic!(add_i16, i16, +);
58impl_arithmetic!(add_i32, i32, +);
59impl_arithmetic!(add_i64, i64, +);
60impl_arithmetic!(add_datetime, i64, +);
61impl_arithmetic!(add_duration, i64, +);
62impl_arithmetic!(add_f32, f32, +);
63impl_arithmetic!(add_f64, f64, +);
64impl_arithmetic!(sub_u8, u8, -);
65impl_arithmetic!(sub_u16, u16, -);
66impl_arithmetic!(sub_u32, u32, -);
67impl_arithmetic!(sub_u64, u64, -);
68impl_arithmetic!(sub_i8, i8, -);
69impl_arithmetic!(sub_i16, i16, -);
70impl_arithmetic!(sub_i32, i32, -);
71impl_arithmetic!(sub_i64, i64, -);
72impl_arithmetic!(sub_datetime, i64, -);
73impl_arithmetic!(sub_duration, i64, -);
74impl_arithmetic!(sub_f32, f32, -);
75impl_arithmetic!(sub_f64, f64, -);
76impl_arithmetic!(div_u8, u8, /);
77impl_arithmetic!(div_u16, u16, /);
78impl_arithmetic!(div_u32, u32, /);
79impl_arithmetic!(div_u64, u64, /);
80impl_arithmetic!(div_i8, i8, /);
81impl_arithmetic!(div_i16, i16, /);
82impl_arithmetic!(div_i32, i32, /);
83impl_arithmetic!(div_i64, i64, /);
84impl_arithmetic!(div_f32, f32, /);
85impl_arithmetic!(div_f64, f64, /);
86impl_arithmetic!(mul_u8, u8, *);
87impl_arithmetic!(mul_u16, u16, *);
88impl_arithmetic!(mul_u32, u32, *);
89impl_arithmetic!(mul_u64, u64, *);
90impl_arithmetic!(mul_i8, i8, *);
91impl_arithmetic!(mul_i16, i16, *);
92impl_arithmetic!(mul_i32, i32, *);
93impl_arithmetic!(mul_i64, i64, *);
94impl_arithmetic!(mul_f32, f32, *);
95impl_arithmetic!(mul_f64, f64, *);
96impl_arithmetic!(rem_u8, u8, %);
97impl_arithmetic!(rem_u16, u16, %);
98impl_arithmetic!(rem_u32, u32, %);
99impl_arithmetic!(rem_u64, u64, %);
100impl_arithmetic!(rem_i8, i8, %);
101impl_arithmetic!(rem_i16, i16, %);
102impl_arithmetic!(rem_i32, i32, %);
103impl_arithmetic!(rem_i64, i64, %);
104impl_arithmetic!(rem_f32, f32, %);
105impl_arithmetic!(rem_f64, f64, %);
106
107macro_rules! impl_rhs_arithmetic {
108 ($name:ident, $type:ty, $operand:ident) => {
109 #[pymethods]
110 impl PySeries {
111 fn $name(&self, py: Python, other: $type) -> PyResult<Self> {
112 Ok(py.allow_threads(|| other.$operand(&self.series)).into())
113 }
114 }
115 };
116}
117
118impl_rhs_arithmetic!(add_u8_rhs, u8, add);
119impl_rhs_arithmetic!(add_u16_rhs, u16, add);
120impl_rhs_arithmetic!(add_u32_rhs, u32, add);
121impl_rhs_arithmetic!(add_u64_rhs, u64, add);
122impl_rhs_arithmetic!(add_i8_rhs, i8, add);
123impl_rhs_arithmetic!(add_i16_rhs, i16, add);
124impl_rhs_arithmetic!(add_i32_rhs, i32, add);
125impl_rhs_arithmetic!(add_i64_rhs, i64, add);
126impl_rhs_arithmetic!(add_f32_rhs, f32, add);
127impl_rhs_arithmetic!(add_f64_rhs, f64, add);
128impl_rhs_arithmetic!(sub_u8_rhs, u8, sub);
129impl_rhs_arithmetic!(sub_u16_rhs, u16, sub);
130impl_rhs_arithmetic!(sub_u32_rhs, u32, sub);
131impl_rhs_arithmetic!(sub_u64_rhs, u64, sub);
132impl_rhs_arithmetic!(sub_i8_rhs, i8, sub);
133impl_rhs_arithmetic!(sub_i16_rhs, i16, sub);
134impl_rhs_arithmetic!(sub_i32_rhs, i32, sub);
135impl_rhs_arithmetic!(sub_i64_rhs, i64, sub);
136impl_rhs_arithmetic!(sub_f32_rhs, f32, sub);
137impl_rhs_arithmetic!(sub_f64_rhs, f64, sub);
138impl_rhs_arithmetic!(div_u8_rhs, u8, div);
139impl_rhs_arithmetic!(div_u16_rhs, u16, div);
140impl_rhs_arithmetic!(div_u32_rhs, u32, div);
141impl_rhs_arithmetic!(div_u64_rhs, u64, div);
142impl_rhs_arithmetic!(div_i8_rhs, i8, div);
143impl_rhs_arithmetic!(div_i16_rhs, i16, div);
144impl_rhs_arithmetic!(div_i32_rhs, i32, div);
145impl_rhs_arithmetic!(div_i64_rhs, i64, div);
146impl_rhs_arithmetic!(div_f32_rhs, f32, div);
147impl_rhs_arithmetic!(div_f64_rhs, f64, div);
148impl_rhs_arithmetic!(mul_u8_rhs, u8, mul);
149impl_rhs_arithmetic!(mul_u16_rhs, u16, mul);
150impl_rhs_arithmetic!(mul_u32_rhs, u32, mul);
151impl_rhs_arithmetic!(mul_u64_rhs, u64, mul);
152impl_rhs_arithmetic!(mul_i8_rhs, i8, mul);
153impl_rhs_arithmetic!(mul_i16_rhs, i16, mul);
154impl_rhs_arithmetic!(mul_i32_rhs, i32, mul);
155impl_rhs_arithmetic!(mul_i64_rhs, i64, mul);
156impl_rhs_arithmetic!(mul_f32_rhs, f32, mul);
157impl_rhs_arithmetic!(mul_f64_rhs, f64, mul);
158impl_rhs_arithmetic!(rem_u8_rhs, u8, rem);
159impl_rhs_arithmetic!(rem_u16_rhs, u16, rem);
160impl_rhs_arithmetic!(rem_u32_rhs, u32, rem);
161impl_rhs_arithmetic!(rem_u64_rhs, u64, rem);
162impl_rhs_arithmetic!(rem_i8_rhs, i8, rem);
163impl_rhs_arithmetic!(rem_i16_rhs, i16, rem);
164impl_rhs_arithmetic!(rem_i32_rhs, i32, rem);
165impl_rhs_arithmetic!(rem_i64_rhs, i64, rem);
166impl_rhs_arithmetic!(rem_f32_rhs, f32, rem);
167impl_rhs_arithmetic!(rem_f64_rhs, f64, rem);