Path: blob/main/crates/polars-ops/src/chunked_array/array/to_struct.rs
6939 views
use polars_core::POOL;1use polars_utils::format_pl_smallstr;2use polars_utils::pl_str::PlSmallStr;3use rayon::prelude::*;45use super::*;67pub type ArrToStructNameGenerator = Arc<dyn Fn(usize) -> PolarsResult<PlSmallStr> + Send + Sync>;89pub fn arr_default_struct_name_gen(idx: usize) -> PlSmallStr {10format_pl_smallstr!("field_{idx}")11}1213pub trait ToStruct: AsArray {14fn to_struct(15&self,16name_generator: Option<ArrToStructNameGenerator>,17) -> PolarsResult<StructChunked> {18let ca = self.as_array();19let n_fields = ca.width();2021let name_generator = name_generator22.as_deref()23.unwrap_or(&|i| Ok(arr_default_struct_name_gen(i)));2425let fields = POOL.install(|| {26(0..n_fields)27.into_par_iter()28.map(|i| {29ca.array_get(30&Int64Chunked::from_slice(PlSmallStr::EMPTY, &[i as i64]),31true,32)33.and_then(|mut s| {34s.rename(name_generator(i)?);35Ok(s)36})37})38.collect::<PolarsResult<Vec<_>>>()39})?;4041StructChunked::from_series(ca.name().clone(), ca.len(), fields.iter())42}43}4445impl ToStruct for ArrayChunked {}464748