feat(tvix/eval): implement builtins.partition

Change-Id: I8b591f3057c68c1542046fc5a771973f2238c9df
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7020
Autosubmit: j4m3s <james.landrein@gmail.com>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
James Landrein 2022-10-14 13:49:20 +02:00 committed by clbot
parent 4dcb8f38c2
commit 5ee2258692
3 changed files with 39 additions and 0 deletions

View file

@ -446,6 +446,31 @@ fn pure_builtins() -> Vec<Builtin> {
("version".into(), version),
]))))
}),
Builtin::new(
"partition",
&[true, true],
|args: Vec<Value>, vm: &mut VM| {
let mut right: Vec<Value> = vec![];
let mut wrong: Vec<Value> = vec![];
let list: NixList = args[1].to_list()?;
for elem in list.into_iter() {
let result = vm.call_with(&args[0], [elem.clone()])?;
if result.force(vm)?.as_bool()? {
right.push(elem);
} else {
wrong.push(elem);
};
}
let mut res: BTreeMap<NixString, Value> = BTreeMap::new();
res.insert("right".into(), Value::List(right.into()));
res.insert("wrong".into(), Value::List(wrong.into()));
Ok(Value::attrs(NixAttrs::from_map(res)))
},
),
Builtin::new(
"removeAttrs",
&[true, true],