polars_ops/series/ops/
int_range.rs

1use 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    ChunkedArray<T>: IntoSeries,
13    std::ops::Range<T::Native>: DoubleEndedIterator<Item = T::Native>,
14{
15    let mut ca = match step {
16        0 => polars_bail!(InvalidOperation: "step must not be zero"),
17        1 => ChunkedArray::<T>::from_iter_values(name, start..end),
18        2.. => ChunkedArray::<T>::from_iter_values(name, (start..end).step_by(step as usize)),
19        _ => ChunkedArray::<T>::from_iter_values(
20            name,
21            (end..start)
22                .step_by(step.unsigned_abs() as usize)
23                .map(|x| start - (x - end)),
24        ),
25    };
26
27    let is_sorted = if end < start {
28        IsSorted::Descending
29    } else {
30        IsSorted::Ascending
31    };
32    ca.set_sorted_flag(is_sorted);
33
34    Ok(ca.into_series())
35}