diff options
-rw-r--r-- | tvix/eval/src/builtins/mod.rs | 13 | ||||
-rw-r--r-- | tvix/eval/src/tests/tvix_tests/eval-okay-concatmap.exp | 1 | ||||
-rw-r--r-- | tvix/eval/src/tests/tvix_tests/eval-okay-concatmap.nix | 1 |
3 files changed, 15 insertions, 0 deletions
diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs index b859e2844ee8..e047ef599b2d 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -164,6 +164,19 @@ fn pure_builtins() -> Vec<Builtin> { ))) }), Builtin::new( + "concatMap", + &[true, true], + |args: Vec<Value>, 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], |args: Vec<Value>, vm: &mut VM| arithmetic_op!(&*args[0].force(vm)?, &*args[1].force(vm)?, /), 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 000000000000..14d804aa22f5 --- /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 000000000000..149a0722b11d --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-concatmap.nix @@ -0,0 +1 @@ +(builtins.concatMap (x: [x] ++ ["z"]) ["a" "b"]) |