diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs index b859e2844..e047ef599 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -163,6 +163,19 @@ fn pure_builtins() -> Vec { lists.into_iter().flatten().collect::>(), ))) }), + Builtin::new( + "concatMap", + &[true, true], + |args: Vec, vm: &mut VM| { + let list = args[1].to_list()?; + let mut res = Vec::new(); + for val in list { + vm.push(val); + res.extend(vm.call_value(&args[0])?.force(vm)?.to_list()?); + } + Ok(Value::List(res.into())) + }, + ), Builtin::new( "div", &[false, false], diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-concatmap.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-concatmap.exp new file mode 100644 index 000000000..14d804aa2 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-concatmap.exp @@ -0,0 +1 @@ +[ "a" "z" "b" "z" ] diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-concatmap.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-concatmap.nix new file mode 100644 index 000000000..149a0722b --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-concatmap.nix @@ -0,0 +1 @@ +(builtins.concatMap (x: [x] ++ ["z"]) ["a" "b"])