polars_ops/series/ops/
int_range.rs1use polars_core::prelude::*;
2use polars_core::series::IsSorted;
3
4pub fn new_int_range<T>(
5 start: T::Native,
6 end: T::Native,
7 step: i64,
8 name: PlSmallStr,
9) -> PolarsResult<Series>
10where
11 T: PolarsIntegerType,
12 std::ops::Range<T::Native>: DoubleEndedIterator<Item = T::Native>,
13{
14 let mut ca = match step {
15 0 => polars_bail!(InvalidOperation: "step must not be zero"),
16 1 => ChunkedArray::<T>::from_iter_values(name, start..end),
17 2.. => ChunkedArray::<T>::from_iter_values(name, (start..end).step_by(step as usize)),
18 _ => ChunkedArray::<T>::from_iter_values(
19 name,
20 (end..start)
21 .step_by(step.unsigned_abs() as usize)
22 .map(|x| start - (x - end)),
23 ),
24 };
25
26 let is_sorted = if end < start {
27 IsSorted::Descending
28 } else {
29 IsSorted::Ascending
30 };
31 ca.set_sorted_flag(is_sorted);
32
33 Ok(ca.into_series())
34}