feat(nix/eval): Implement builtins.groupBy

Change-Id: I3e0aa017a7100cbeb86d2e5747471b36affcc102
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7038
Autosubmit: grfn <grfn@gws.fyi>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
Griffin Smith 2022-10-18 06:32:35 -04:00 committed by clbot
parent dfa4c4847c
commit e2f0967d3f
3 changed files with 34 additions and 0 deletions

View file

@ -323,6 +323,17 @@ fn pure_builtins() -> Vec<Builtin> {
}),
}
}),
Builtin::new("groupBy", &[true, true], |args: Vec<Value>, vm: &mut VM| {
let mut res: BTreeMap<NixString, Value> = BTreeMap::new();
for val in args[1].to_list()? {
let key = vm.call_with(&args[0], [val.clone()])?.force(vm)?.to_str()?;
res.entry(key)
.or_insert_with(|| Value::List(NixList::new()))
.as_list_mut()?
.push(val);
}
Ok(Value::attrs(NixAttrs::from_map(res)))
}),
Builtin::new("hasAttr", &[true, true], |args: Vec<Value>, _: &mut VM| {
let k = args[0].to_str()?;
let xs = args[1].to_attrs()?;