use indexmap::IndexMap; use nu_errors::ShellError; use nu_protocol::{TaggedDictBuilder, UntaggedValue, Value}; use nu_source::Tag; use nu_value_ext::as_string; #[allow(clippy::type_complexity)] pub fn group( values: &Value, grouper: &Option Result + Send>>, tag: impl Into, ) -> Result { let tag = tag.into(); let mut groups: IndexMap> = IndexMap::new(); for value in values.table_entries() { let group_key = if let Some(ref grouper) = grouper { grouper(&value) } else { as_string(&value) }; let group = groups.entry(group_key?).or_insert(vec![]); group.push((*value).clone()); } let mut out = TaggedDictBuilder::new(&tag); for (k, v) in groups.iter() { out.insert_untagged(k, UntaggedValue::table(v)); } Ok(out.into_value()) }