polars_utils/
functions.rs1use std::mem::MaybeUninit;
2use std::ops::Range;
3use std::sync::Arc;
4
5#[inline(always)]
7pub fn range_portion(i: usize, k: usize, r: Range<usize>) -> Range<usize> {
8 let n = r.len();
11 let base_size = n / k;
12 let num_one_larger = n % k;
13 let num_before = base_size * i + i.min(num_one_larger);
14 let our_size = base_size + (i < num_one_larger) as usize;
15 r.start + num_before..r.start + num_before + our_size
16}
17
18pub fn arc_map<T: Clone, F: FnMut(T) -> T>(mut arc: Arc<T>, mut f: F) -> Arc<T> {
19 unsafe {
20 Arc::make_mut(&mut arc);
22
23 let mut uninit_arc = Arc::from_raw(Arc::into_raw(arc).cast::<MaybeUninit<T>>());
25
26 let ptr = Arc::get_mut(&mut uninit_arc).unwrap_unchecked() as *mut MaybeUninit<T>;
28 *ptr = MaybeUninit::new(f(ptr.read().assume_init()));
29
30 Arc::from_raw(Arc::into_raw(uninit_arc).cast::<T>())
32 }
33}
34
35pub fn try_arc_map<T: Clone, E, F: FnMut(T) -> Result<T, E>>(
36 mut arc: Arc<T>,
37 mut f: F,
38) -> Result<Arc<T>, E> {
39 unsafe {
40 Arc::make_mut(&mut arc);
42
43 let mut uninit_arc = Arc::from_raw(Arc::into_raw(arc).cast::<MaybeUninit<T>>());
45
46 let ptr = Arc::get_mut(&mut uninit_arc).unwrap_unchecked() as *mut MaybeUninit<T>;
48 *ptr = MaybeUninit::new(f(ptr.read().assume_init())?);
49
50 Ok(Arc::from_raw(Arc::into_raw(uninit_arc).cast::<T>()))
52 }
53}