From 844d28894978ff5522cb57947edbeb8f28dad309 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sun, 2 Oct 2022 19:59:37 +0300 Subject: feat(tvix/eval): implement `builtins.all` Change-Id: I19ec2b2194681efd73041f4aa1e5f2c893e839c2 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6844 Tested-by: BuildkiteCI Reviewed-by: sterni --- tvix/eval/src/builtins/mod.rs | 14 ++++++++++++++ tvix/eval/src/tests/tvix_tests/eval-okay-builtins-all.exp | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-builtins-all.nix | 15 +++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-builtins-all.exp create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-builtins-all.nix (limited to 'tvix/eval/src') diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs index 94a035c2ece7..bdfa791574bb 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -61,6 +61,20 @@ fn pure_builtins() -> Vec { Builtin::new("abort", &[true], |args, _| { Err(ErrorKind::Abort(args[0].to_str()?.to_string())) }), + Builtin::new("all", &[true, true], |args, vm| { + for value in args[1].to_list()?.into_iter() { + let pred_result = { + vm.push(value); + vm.call_value(&args[0]) + }?; + + if !pred_result.force(vm)?.as_bool()? { + return Ok(Value::Bool(false)); + } + } + + Ok(Value::Bool(true)) + }), Builtin::new("attrNames", &[true], |args, _| { let xs = args[0].to_attrs()?; let mut output = Vec::with_capacity(xs.len()); diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-all.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-all.exp new file mode 100644 index 000000000000..82ca7e6b6db7 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-all.exp @@ -0,0 +1 @@ +[ true true false false false false true true false ] diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-all.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-all.nix new file mode 100644 index 000000000000..12d62632dd6c --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-all.nix @@ -0,0 +1,15 @@ +[ + (builtins.all (x: x) [ ]) + (builtins.all (x: x) [ true true true ]) + (builtins.all (x: x) [ false false false ]) + (builtins.all (x: x) [ true true false ]) + (builtins.all (x: x) [ false true true ]) + + # evaluation should short-circuit + (builtins.all (x: x) [ true false (builtins.abort "should be unreachable") ]) + + # arbitrary functions supported + (builtins.all (x: x * 2 == 42) [ ]) + (builtins.all (x: x * 2 == 42) [ 21 21 21 ]) + (builtins.all (x: x * 2 == 42) [ 1 2 3 ]) +] -- cgit 1.4.1